InternalsVisibleTo不是为我的托管C++项目工作,而是为我的C#项目工作。任何帮助都将不胜感激。这里是一个简化的布局。
Project A - C#,有一个我想从B/C访问的内部属性。
项目B -托管C++。参考文献A.
项目C - C#,参考A.
所有项目都用相同的密钥签名。查看使用ILDASM或Reflector编译的程序集,可以看到它们都正确地签名(当我注释掉内部属性使用情况时)。
在AssemblyInfo.cs In 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 BMSDN文档说这适用于C++。有什么窃听器或者别的什么我需要做的吗?
是否有另一种方法可以保护属性,使其只能由由我签名的程序集使用?我知道我可以保护我所有的程序集,但是我可以这样做吗?
编辑
基于MSDN中的注释,我将属性更改为以下内容,但仍然无法工作。
[assembly: InternalsVisibleTo( "B, " +
"PublicKey=00240000048000009400000006020000002400005253413100040000010001007" +
"50098646D1C04C2A041FAAF801521A769535DE9A04CD3B4DEDCCBF73D1A6456BF4FE5881451" +
"0E84983C72D0460B8BA85C52A9CACDC4A0785A08E247C335884C2049ECFE6B2C5E20A18FE4B" +
"9BFF009ADA232E980D220B3C9586C9C5EE29C29AEE8853DB7BB90CF5A4C704F5244E1A1085C" +
"4306008535049A0EBB00FE47E78DCB" ),
InternalsVisibleTo( "C, " +
"PublicKey=00240000048000009400000006020000002400005253413100040000010001007" +
"50098646D1C04C2A041FAAF801521A769535DE9A04CD3B4DEDCCBF73D1A6456BF4FE5881451" +
"0E84983C72D0460B8BA85C52A9CACDC4A0785A08E247C335884C2049ECFE6B2C5E20A18FE4B" +
"9BFF009ADA232E980D220B3C9586C9C5EE29C29AEE8853DB7BB90CF5A4C704F5244E1A1085C" +
"4306008535049A0EBB00FE47E78DCB" )]发布于 2009-01-07 15:07:23
我找到了答案。C++的工作方式与其他语言不同。除了InternalsVisibleTo之外,还必须使用as_friend关键字引用程序集A。因为as_friend不是Add References对话框中的一个选项,所以不能添加项目引用,而是需要在每个CPP文件中添加一个引用。
#using <A.dll> as_friend然后,还需要更改程序集搜索路径,以包括项目A的构建目录。
IMHO,这是破坏和典型的托管C++是第二类语言。如果无法执行项目引用,则最终将引用生成调试或发布目录中的程序集。这打破了依赖关系,当您将配置从调试更改为发布时,可以让它引用正确的DLL的唯一方法是使用丑陋的#IFDEF调试和#使用的相对路径。
对于InternalsVisibleToAttribute文档中没有提到这一点,我也感到失望。我需要在C++文档中寻找信息。
编辑:自那时以来,InternalsVisisbleTo的文档已经用指向朋友大会(C++)文档的链接进行了更新。
发布于 2019-10-28 12:30:28
注意:
也许有人会帮助我们不要手工添加引用到由“#使用as_friend”包含的库中,因为如果它停留在这样的引用中,它可能不会被编译。
让.NET机制本身决定在# the指令之后如何处理这个库。
是的,将库添加到Properties -> C/C++ -> General -> AdditionalUsingDirectories中的列表中。
https://stackoverflow.com/questions/417842
复制相似问题