Introduzione all'Assemblea Youyuan Sappiamo che i membri di una classe definiti come interni (inclusi tipi, metodi, proprietà, variabili, eventi) possono essere acceduti solo nello stesso assembly (ovviamente, sto parlando del modo normale, escludendo l'accesso tramite riflessione). Questa regola è in . .NET 2.0 è leggermente rotto, permettendoci di impostare i membri interni di un assembly per essere accessibili da membri specifici. Chiamiamo l'assembly che contiene questi membri interni assembly sorgente, e l'insieme dell'assembly è chiamato assembly amico.
Uso dell'assemblaggio degli amici Questo Attributo viene utilizzato a livello di assemblaggio.
In questo modo, dopo che il programma FriendAssembly fa riferimento all'assembly, può accedere alla proprietà interna Name. In generale, questo assembly:InternalsVisibleTo("FriendAssembly") è meglio posizionato nel AssemblyInfo.cs, dopotutto è a livello assembly.
Quando usare InternalsToVisibleTo In effetti, questo attributo non viene utilizzato in applicazioni generali, e non dovremmo abusare di questo attributo. Perché, in generale, un assemblaggio ben progettato non deve necessariamente essere aperto al mondo esterno. Ma gli scenari di unit testing possono sfruttare questa caratteristica. Con questa caratteristica, possiamo specificare che il codice dei test unitari abbia accesso a quei membri interni così da poterli testare in modo unitario. Tuttavia, questo richiede di scrivere il nome dell'assembly amico morto nell'assembly sorgente, il che causa alcuni problemi di sicurezza. La sicurezza può essere garantita introducendo assembly di firme.
InternalsToVisibleTo e l'assiematore della firma Puoi specificare direttamente il nome e la chiave pubblica dell'assembly meta amico in InternalsVisibleTo. Usa la riga di comando VS developer per generare la chiave pubblica di FriendAssembly:
Specifica il nome dell'assembly amico e la chiave pubblica dell'assembly sorgente:
Infatti, poiché l'assembly amico fa riferimento all'assembly sorgente, e l'assembly firmato fa riferimento a un assembly non firmato, e l'assembly firmato non può specificare un assembly amico senza segno, nessuno di essi è firmato, allora deve essere firmato.
|