.net c++-cli internalsvisibleto

.net - InternalsVisibleTo no funciona para Managed C++



c++-cli (1)

Encontré la respuesta a esto. C ++ funciona de manera diferente a los otros idiomas. Además de InternalsVisibleTo, debe hacer referencia al ensamblado A con la palabra clave as_friend . Como as_friend no es una opción en el cuadro de diálogo Agregar referencias, no puede agregar una referencia de proyecto; en su lugar, debe agregar una referencia en cada archivo CPP que necesite.

#using <A.dll> as_friend

También necesita cambiar su ruta de búsqueda de conjunto para incluir el directorio de compilación del proyecto A.

En mi humilde opinión, esto está roto y es típico de que C ++ administrado sea un lenguaje de segunda clase . Sin la posibilidad de hacer referencias de proyecto, terminas haciendo referencia al ensamblado en el directorio de depuración o lanzamiento de compilación. Esto rompe las dependencias y la única forma en que puede hacer que haga referencia a la DLL correcta cuando se cambia la configuración de depuración a versión es con feo #IFDEF DEBUG y rutas relativas para #using.

También me decepcionó que esto no se haya mencionado en la documentación de InternalsVisibleToAttribute . Necesitaba buscar en la documentación de C ++ para encontrar la información.

Editar : La documentación para InternalsVisisbleTo se ha actualizado desde entonces con un enlace al documento Friend Assemblies (C ++) .

InternalsVisibleTo no funciona para mis proyectos administrados de C ++, pero es para mis proyectos de C #. Cualquier ayuda sería apreciada. Aquí hay un diseño simplificado.

Proyecto A - C #, tiene una propiedad interna a la que quiero acceder desde B / C.
Proyecto B - C ++ administrado. Referencias A.
Proyecto C - C #, referencias A.

Todos los proyectos están firmados con la misma clave. Al observar los ensamblados compilados con ILDASM o Reflector, se muestra que todos están firmados correctamente (cuando comento el uso interno de la propiedad).

En AssemblyInfo.cs en el Proyecto A , tengo el siguiente InternalsVisibleTo;

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

Las teclas están cortadas, así que sé que son correctas.

Cuando intento compilar, A & C compila bien, pero el proyecto B falla con

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

Los documentos de MSDN dicen que esto funciona con C ++. ¿Hay algún error u otra cosa que deba hacer?

¿Hay alguna otra manera en que pueda proteger una propiedad para que solo pueda ser utilizada por ensambles firmados por mí? Sé que puedo proteger todo mi ensamblaje, pero ¿puedo hacerlo en un nivel granular como este?

EDITAR

En base a los comentarios en MSDN, cambié el atributo al siguiente, pero eso aún no funciona.

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