InternalsVisibleTo不适用于我的托管C++项目,但它适用于我的C#项目.任何帮助,将不胜感激.这是一个简化的布局.
项目A - C#,具有我想从B/C访问的内部属性.
项目B - 托管C++.引用一个.
项目Ç - C#,引用一个.
所有项目都使用相同的密钥签名.使用ILDASM或Reflector查看已编译的程序集,表明它们都已正确签名(当我注释掉内部属性用法时).
在Project A的 AssemblyInfo.cs中,我有以下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\\CppClass.cpp 201 B
MSDN文档说这适用于C++.我需要做一个bug还是别的什么?
是否有另一种方法可以保护财产,使其只能由我签署的集合使用?我知道我可以保护我的所有组件,但是我可以在这样的粒度级别上进行吗?
编辑
根据MSDN中的注释,我将属性更改为以下内容,但仍然无效.
[assembly: InternalsVisibleTo( "B, " + "PublicKey=00240000048000009400000006020000002400005253413100040000010001007" + "50098646D1C04C2A041FAAF801521A769535DE9A04CD3B4DEDCCBF73D1A6456BF4FE5881451" + "0E84983C72D0460B8BA85C52A9CACDC4A0785A08E247C335884C2049ECFE6B2C5E20A18FE4B" + "9BFF009ADA232E980D220B3C9586C9C5EE29C29AEE8853DB7BB90CF5A4C704F5244E1A1085C" + "4306008535049A0EBB00FE47E78DCB" ), InternalsVisibleTo( "C, " + "PublicKey=00240000048000009400000006020000002400005253413100040000010001007" + "50098646D1C04C2A041FAAF801521A769535DE9A04CD3B4DEDCCBF73D1A6456BF4FE5881451" + "0E84983C72D0460B8BA85C52A9CACDC4A0785A08E247C335884C2049ECFE6B2C5E20A18FE4B" + "9BFF009ADA232E980D220B3C9586C9C5EE29C29AEE8853DB7BB90CF5A4C704F5244E1A1085C" + "4306008535049A0EBB00FE47E78DCB" )]
Rob Prouse.. 26
我找到了答案.C++与其他语言的工作方式不同.除了InternalsVisibleTo之外,还必须使用as_friend关键字引用程序集A. 由于as_friend不是"添加引用"对话框中的选项,因此无法添加项目引用,而是需要在每个CPP文件中添加所需的引用.
#usingas_friend
然后,您还需要更改程序集搜索路径以包含项目A的构建目录.
恕我直言,这是破碎的,典型的托管C++是第二类语言.如果没有项目引用的能力,最终会在构建调试或发布目录中引用程序集.这会破坏依赖关系,当您将配置从调试更改为发布时,唯一可以让它引用正确的DLL的方法是使用丑陋的#IFDEF DEBUG和#using的相对路径.
我也很失望InternalsVisibleToAttribute文档中没有提到这一点.我需要深入研究C++文档以查找信息.
编辑:此后,InternalsVisisbleTo的文档已更新为指向朋友程序集(C++)文档的链接.
我找到了答案.C++与其他语言的工作方式不同.除了InternalsVisibleTo之外,还必须使用as_friend关键字引用程序集A. 由于as_friend不是"添加引用"对话框中的选项,因此无法添加项目引用,而是需要在每个CPP文件中添加所需的引用.
#usingas_friend
然后,您还需要更改程序集搜索路径以包含项目A的构建目录.
恕我直言,这是破碎的,典型的托管C++是第二类语言.如果没有项目引用的能力,最终会在构建调试或发布目录中引用程序集.这会破坏依赖关系,当您将配置从调试更改为发布时,唯一可以让它引用正确的DLL的方法是使用丑陋的#IFDEF DEBUG和#using的相对路径.
我也很失望InternalsVisibleToAttribute文档中没有提到这一点.我需要深入研究C++文档以查找信息.
编辑:此后,InternalsVisisbleTo的文档已更新为指向朋友程序集(C++)文档的链接.