InternalsVisible, не работает для Managed C ++ - PullRequest
12 голосов
/ 06 января 2009

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

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

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

В AssemblyInfo.cs в проекте 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 говорят, что это работает с C ++. Есть ли ошибка или что-то еще, что мне нужно сделать?

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

EDIT

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

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

1 Ответ

26 голосов
/ 07 января 2009

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

#using <A.dll> as_friend

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

ИМХО, это не работает и типично для управляемого C ++, являющегося языком второго класса . Без возможности делать ссылки на проекты вы в конечном итоге ссылаетесь на сборку в каталоге отладки или выпуска сборки. Это нарушает зависимости, и единственный способ заставить его ссылаться на правильную DLL при смене конфигурации с отладочной на выпускную - с помощью уродливого #IFDEF DEBUG и относительных путей для # с помощью.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...