Question

InternalsVisibleTo ne fonctionne pas pour mes projets C ++ gérés, mais pour mes projets C #. Toute aide serait appréciée. Voici une présentation simplifiée.

Le projet A - C #, possède une propriété interne à laquelle je souhaite accéder à partir de B / C .
Projet B : C ++ géré. Références A .
Projet C - C #, références A .

Tous les projets sont signés avec la même clé. L'examen des assemblys compilés avec ILDASM ou Reflector montre qu'ils sont tous correctement signés (lorsque je commente l'utilisation de la propriété interne).

Dans AssemblyInfo.cs du projet A , j'ai les éléments suivants InternalsVisibleTo;

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

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

Les touches sont coupées, alors je sais qu’elles sont correctes.

Lorsque j'essaie de compiler, A & amp; C la compilation est correcte, mais le projet B échoue avec

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

Les documents MSDN indiquent que cela fonctionne avec C ++. Y a-t-il un bug ou quelque chose d'autre que je dois faire?

Existe-t-il un autre moyen de protéger une propriété afin qu'elle ne puisse être utilisée que par des assemblys signés par moi? Je sais que je peux protéger tout mon assemblage, mais puis-je le faire à un niveau granulaire comme celui-ci?

MODIFIER

D'après les commentaires dans MSDN, j'ai modifié l'attribut comme suit, mais cela ne fonctionne toujours pas.

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

La solution

J'ai trouvé la réponse à cette question. C ++ fonctionne différemment des autres langages. En plus de InternalsVisibleTo, vous devez référencer l'assembly A avec le mot clé as_friend . Comme as_friend n'est pas une option de la boîte de dialogue Ajouter des références, vous ne pouvez pas ajouter de référence de projet. Vous devez plutôt ajouter une référence dans chaque fichier CPP dont vous avez besoin.

#using <A.dll> as_friend

Vous devez également modifier votre chemin de recherche d'assembly pour inclure le répertoire de construction du projet A.

IMHO, cela est cassé et caractéristique du fait que le C ++ géré est un langage de seconde classe . Sans la possibilité de faire des références de projet, vous finissez par référencer l'assembly dans le répertoire de débogage ou de publication de la construction. Cela casse les dépendances et le seul moyen de le faire référencer la DLL correcte lorsque vous modifiez votre configuration de debug en release est avec #IFDEF DEBUG et les chemins relatifs pour #using.

J'ai également été déçu que cela ne soit pas mentionné dans le InternalsVisibleToAttribute documentation. J'avais besoin de fouiller dans la documentation C ++ pour trouver les informations.

Modifier : la documentation de InternalsVisisbleTo a depuis été mis à jour avec un lien vers ami Assemblies (C ++) document.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top