Condividi tramite


Classe System.Runtime.CompilerServices.InternalsVisibleToAttribute

Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.

L'attributo InternalsVisibleToAttribute specifica che i tipi normalmente visibili solo all'interno dell'assembly corrente sono visibili a un assembly specificato.

In genere, i tipi e i membri con internal ambito in C# o Friend ambito in Visual Basic sono visibili solo nell'assembly in cui sono definiti. I tipi e i membri con protected internal ambito (Protected Friend ambito in Visual Basic) sono visibili solo nel proprio assembly o nei tipi che derivano dalla classe contenitore. I tipi e i membri con private protected ambito (Private Protected ambito in Visual Basic) sono visibili nella classe contenitore o nei tipi che derivano dalla classe contenitore all'interno dell'assembly corrente

L'attributo InternalsVisibleToAttribute rende questi tipi e membri visibili anche ai tipi in un assembly specificato, noto come assembly friend. Ciò si applica solo ai internal membri (Friend in Visual Basic), protected internal(Protected Friend in Visual Basic) e private protected (Private Protected in Visual Basic), ma non private a quelli.

Nota

Nel caso dei private protected membri (Private Protected in Visual Basic), l'attributo InternalsVisibleToAttribute estende l'accessibilità solo ai tipi che derivano dalla classe contenitore del membro.

L'attributo viene applicato a livello di assembly. Ciò significa che può essere incluso all'inizio di un file di codice sorgente oppure può essere incluso nel file AssemblyInfo in un progetto di Visual Studio. È possibile usare l'attributo per specificare un singolo assembly Friend in grado di accedere ai tipi interni e ai membri dell'assembly corrente. È possibile definire più assembly Friend in due modi. Possono essere visualizzati come singoli attributi a livello di assembly, come illustrato nell'esempio seguente.

[assembly:InternalsVisibleTo("Friend1a")]
[assembly:InternalsVisibleTo("Friend1b")]
<assembly:InternalsVisibleTo("Friend1a")>
<assembly:InternalsVisibleTo("Friend1b")>

Possono anche essere visualizzati con tag separati InternalsVisibleToAttribute , ma una singola assembly parola chiave, come illustrato nell'esempio seguente.

[assembly:InternalsVisibleTo("Friend2a"), 
          InternalsVisibleTo("Friend2b")]
<Assembly:InternalsVisibleTo("Friend2a"), _
 Assembly:InternalsVisibleTo("Friend2b")>

L'assembly friend viene identificato dal InternalsVisibleToAttribute costruttore . Sia l'assembly corrente che l'assembly friend devono essere senza segno oppure entrambi gli assembly devono essere firmati con un nome sicuro.

Se entrambi gli assembly non sono firmati, l'argomento assemblyName è costituito dal nome dell'assembly friend, specificato senza un percorso di directory o un'estensione di file.

Se entrambi gli assembly sono firmati con un nome sicuro, l'argomento del InternalsVisibleToAttribute costruttore deve essere costituito dal nome dell'assembly senza il percorso della directory o l'estensione del nome file, insieme alla chiave pubblica completa (e non al token di chiave pubblica). Per ottenere la chiave pubblica completa di un assembly con nome sicuro, vedere la sezione Ottenere la chiave pubblica completa più avanti in questo articolo. Per altre informazioni sull'uso InternalsVisibleToAttribute di con assembly con nome sicuro, vedere il InternalsVisibleToAttribute costruttore.

Non includere valori per il CultureInfocampo , Versiono ProcessorArchitecture nell'argomento. I compilatori Visual Basic, C# e C++ considerano questo valore come un errore del compilatore. Se si usa un compilatore che non lo considera come un errore ( ad esempio l'assembler IL (ILAsm.exe)) e gli assembly sono con nome sicuro, viene generata un'eccezione MethodAccessException la prima volta che l'assembly Friend specificato accede all'assembly che contiene l'attributo InternalsVisibleToAttribute .

Per altre informazioni su come usare questo attributo, vedere Assembly Friend e assembly Friend C++.

Ottenere la chiave pubblica completa

È possibile usare lo strumento nome sicuro (Sn.exe) per recuperare la chiave pubblica completa da un file di chiave con nome sicuro (con estensione snk). A tale scopo, seguire questa procedura:

  1. Estrarre la chiave pubblica dal file di chiave con nome sicuro in un file separato:

    Sn -p <snk_file> <outfile>

  2. Visualizzare la chiave pubblica completa nella console:

    Sn -tp <outfile>

  3. Copiare e incollare il valore completo della chiave pubblica nel codice sorgente.

Compilare l'assembly Friend con C#

Se si usa il compilatore C# per compilare l'assembly Friend, è necessario specificare in modo esplicito il nome del file di output (.exe o .dll) usando l'opzione del compilatore /out . Il compilatore non ha infatti ancora generato il nome dell'assembly in fase di compilazione quando crea l'associazione a riferimenti esterni. L'opzione del compilatore /out è facoltativa per il compilatore Visual Basic e l'opzione del compilatore -out o -o corrispondente non deve essere usata durante la compilazione di assembly Friend con il compilatore F#.

Compilare l'assembly Friend con C++

In C++, per rendere i membri interni abilitati dall'attributo InternalsVisibleToAttribute accessibile a un assembly Friend, è necessario usare l'attributo as_friend nella direttiva C++. Per altre informazioni, vedere Assembly Friend (C++).