Подтвердить что ты не робот

InternalsVisibleTo не работает для управляемого С++

InternalsVisibleTo не работает для моих управляемых проектов на С++, но это для моих проектов С#. Любая помощь будет оценена по достоинству. Вот упрощенная компоновка.

Проект A - С#, имеет внутреннее свойство, с которым я хочу получить доступ: B/C.
Проект B - управляемый С++. Ссылки A.
Проект C - С#, ссылки A.

Все проекты подписаны с тем же ключом. Глядя на скомпилированные сборки с помощью ILDASM или Reflector, убедитесь, что все они правильно подписаны (когда я комментирую использование внутреннего свойства).

В AssemblyInfo.cs в Project A у меня есть следующие InternalsVisibleTo;

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

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

Ключи отключены, поэтому я знаю, что они верны.

Когда я пытаюсь скомпилировать, A и C компилировать отлично, но проект B не работает с

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

Документы MSDN говорят, что это работает с С++. Есть ли ошибка или что-то еще, что мне нужно сделать?

Есть ли другой способ защитить свойство, чтобы его могли использовать только подписанные мной сборки? Я знаю, что могу защитить всю свою сборку, но могу ли я сделать это на гранулированном уровне?

ИЗМЕНИТЬ

Основываясь на комментариях в MSDN, я изменил атрибут на следующий, но это все еще не работает.

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

Ответ 1

Я нашел ответ на этот вопрос. С++ работает иначе, чем другие языки. В дополнение к InternalsVisibleTo вы должны ссылаться на сборку A с ключевым словом as_friend. Поскольку as_friend не является вариантом в диалоговом окне "Добавить ссылки", вы не можете добавить ссылку на проект, вместо этого вам нужно добавить ссылку в каждый файл CPP, который вам нужен.

#using <A.dll> as_friend

Затем вам также необходимо изменить путь поиска сборки, чтобы включить каталог сборки проекта A.

IMHO, это сломанный и типичный для управляемого С++ - язык второго класса. Без возможности выполнять ссылки на проекты вы в конечном итоге ссылаетесь на сборку в каталоге сборки отладки или выпуска. Это разрывает зависимости и единственный способ заставить его ссылаться на правильную DLL при изменении конфигурации с отладки на выпуск с уродливым #IFDEF DEBUG и относительными путями для #using.

Я также был разочарован тем, что это не упоминалось в документации InternalsVisibleToAttribute. Мне нужно было копаться в документации на С++, чтобы найти информацию.

Изменить. Документация для InternalsVisisbleTo с тех пор была обновлена ​​ссылкой на Документ Friend Assemblies (С++).