Domanda

InternalsVisibleTo non funziona per i miei progetti C ++ gestiti, ma è per i miei progetti C #. Qualsiasi aiuto sarebbe apprezzato. Ecco un layout semplificato.

Progetto A - C #, ha una proprietà interna a cui voglio accedere da B / C .
Progetto B - C ++ gestito. Riferimenti A .
Progetto C - C #, riferimenti A .

Tutti i progetti sono firmati con la stessa chiave. Guardando gli assiemi compilati con ILDASM o Reflector dimostriamo che sono tutti firmati correttamente (quando commento l'utilizzo della proprietà interna).

In AssemblyInfo.cs nel Progetto A , ho i seguenti InternalsVisibleTo;

[assembly: InternalsVisibleTo( "B, " +
   "PublicKey=00240000048000009400000006020000002400005253413100040000010001007" +
   "50098646D1C04C2A041FAAF801521A769535DE9A04CD3B4DEDCCBF73D1A6456BF4FE5881451" +
   "0E84983C72D0460B8BA85C52A9CACDC4A0785A08E247C335884C2049ECFE6B2C5E20A18FE4B" +
   "9BFF009ADA232E980D220B3C9586C9C5EE29C29AEE8853DB7BB90CF5A4C704F5244E1A1085C" +
   "4306008535049A0EBB00FE47E78DCB" )]

[assembly: InternalsVisibleTo( "C, " +
   "PublicKey=00240000048000009400000006020000002400005253413100040000010001007" +
   "50098646D1C04C2A041FAAF801521A769535DE9A04CD3B4DEDCCBF73D1A6456BF4FE5881451" +
   "0E84983C72D0460B8BA85C52A9CACDC4A0785A08E247C335884C2049ECFE6B2C5E20A18FE4B" +
   "9BFF009ADA232E980D220B3C9586C9C5EE29C29AEE8853DB7BB90CF5A4C704F5244E1A1085C" +
   "4306008535049A0EBB00FE47E78DCB" )]

I tasti sono tagliati e rovinati, quindi so che sono corretti.

Quando provo a compilare, A & amp; C compilazione corretta, ma il progetto B non riesce con

Error 1 error C3767: 'A::MyClass::MyProperty::get': candidate function(s) not accessible c:\Users\<snip>\CppClass.cpp 201 B

I documenti MSDN dicono che funziona con C ++. C'è un bug o qualcos'altro che devo fare?

Esiste un altro modo per proteggere una proprietà in modo che possa essere utilizzata solo da assiemi firmati da me? So di poter proteggere tutto il mio assemblaggio, ma posso farlo a un livello granulare come questo?

Modifica

Sulla base dei commenti in MSDN, ho modificato l'attributo nel modo seguente, ma non funziona ancora.

[assembly: InternalsVisibleTo( "B, " +
   "PublicKey=00240000048000009400000006020000002400005253413100040000010001007" +
   "50098646D1C04C2A041FAAF801521A769535DE9A04CD3B4DEDCCBF73D1A6456BF4FE5881451" +
   "0E84983C72D0460B8BA85C52A9CACDC4A0785A08E247C335884C2049ECFE6B2C5E20A18FE4B" +
   "9BFF009ADA232E980D220B3C9586C9C5EE29C29AEE8853DB7BB90CF5A4C704F5244E1A1085C" +
   "4306008535049A0EBB00FE47E78DCB" ),
InternalsVisibleTo( "C, " +
   "PublicKey=00240000048000009400000006020000002400005253413100040000010001007" +
   "50098646D1C04C2A041FAAF801521A769535DE9A04CD3B4DEDCCBF73D1A6456BF4FE5881451" +
   "0E84983C72D0460B8BA85C52A9CACDC4A0785A08E247C335884C2049ECFE6B2C5E20A18FE4B" +
   "9BFF009ADA232E980D220B3C9586C9C5EE29C29AEE8853DB7BB90CF5A4C704F5244E1A1085C" +
   "4306008535049A0EBB00FE47E78DCB" )]
È stato utile?

Soluzione

Ho trovato la risposta a questo. C ++ funziona in modo diverso rispetto alle altre lingue. Oltre a InternalsVisibleTo, devi fare riferimento all'assembly A con la parola chiave as_friend . Poiché as_friend non è un'opzione nella finestra di dialogo Aggiungi riferimenti, non è possibile aggiungere un riferimento al progetto, invece, è necessario aggiungere un riferimento in ogni file CPP di cui si necessita.

#using <A.dll> as_friend

È inoltre necessario modificare il percorso di ricerca dell'assembly per includere la directory di generazione del progetto A.

IMHO, questo è rotto e tipico del C ++ gestito essendo un linguaggio di seconda classe . Senza la possibilità di fare riferimenti a progetti, si finisce per fare riferimento all'assembly nella directory di debug o rilascio della build. Ciò rompe le dipendenze e l'unico modo per ottenere che faccia riferimento alla DLL corretta quando si modifica la configurazione dal debug al rilascio è con il brutto DEBUG #IFDEF e relativi percorsi per l'uso #.

Sono stato anche deluso dal fatto che ciò non sia stato menzionato nel InternalsVisibleToAttribute documentazione. Ho dovuto cercare nella documentazione C ++ per trovare le informazioni.

Modifica : la documentazione per InternalsVisisbleTo da allora è stato aggiornato con un link a Friend Documenti Assemblies (C ++) .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top