.net - InternalsVisibleTo 不适用于托管 C++

标签 .net c++-cli internalsvisibleto

InternalsVisibleTo 不适用于我的托管 C++ 项目,但适用于我的 C# 项目。任何帮助将不胜感激。这是一个简化的布局。

项目 A - C#,有一个我想从 B/C 访问的内部属性。
项目 B - 托管 C++。引用文献 A
项目 C - C#,引用 A

所有项目都使用相同的 key 签名。查看使用 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" )]

键是剪切'n'粘贴的,所以我知道它们是正确的。

当我尝试编译时, 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++。是否有错误或我需要做的其他事情?

是否有另一种方法可以保护属性(property),使其只能由我签署的程序集使用?我知道我可以保护我的所有程序集,但是我可以像这样在粒度级别上做到这一点吗?

编辑

根据 MSDN 中的评论,我将属性更改为以下内容,但这仍然不起作用。
[assembly: InternalsVisibleTo( "B, " +
   "PublicKey=00240000048000009400000006020000002400005253413100040000010001007" +
   "50098646D1C04C2A041FAAF801521A769535DE9A04CD3B4DEDCCBF73D1A6456BF4FE5881451" +
   "0E84983C72D0460B8BA85C52A9CACDC4A0785A08E247C335884C2049ECFE6B2C5E20A18FE4B" +
   "9BFF009ADA232E980D220B3C9586C9C5EE29C29AEE8853DB7BB90CF5A4C704F5244E1A1085C" +
   "4306008535049A0EBB00FE47E78DCB" ),
InternalsVisibleTo( "C, " +
   "PublicKey=00240000048000009400000006020000002400005253413100040000010001007" +
   "50098646D1C04C2A041FAAF801521A769535DE9A04CD3B4DEDCCBF73D1A6456BF4FE5881451" +
   "0E84983C72D0460B8BA85C52A9CACDC4A0785A08E247C335884C2049ECFE6B2C5E20A18FE4B" +
   "9BFF009ADA232E980D220B3C9586C9C5EE29C29AEE8853DB7BB90CF5A4C704F5244E1A1085C" +
   "4306008535049A0EBB00FE47E78DCB" )]

最佳答案

我找到了这个问题的答案。 C++ 的工作方式与其他语言不同。除了 InternalsVisibleTo,您还必须引用程序集 一个 as_friend 关键字。由于 as_friend 不是“添加引用”对话框中的选项,因此您无法添加项目引用,而是需要在您需要的每个 CPP 文件中添加引用。

#using <A.dll> as_friend

然后,您还需要更改程序集搜索路径以包含项目 A 的构建目录。

恕我直言,这是 作为二等语言的托管 C++ 被破坏和典型 .如果无法进行项目引用,您最终会引用构建调试或发布目录中的程序集。这打破了依赖关系,当您将配置从调试更改为发布时,您可以让它引用正确的 DLL 的唯一方法是使用丑陋的 #IFDEF DEBUG 和 #using 的相对路径。

我也很失望 InternalsVisibleToAttribute 中没有提到这一点。文档。我需要在 C++ documentation 中挖掘查找信息。

编辑 : InternalsVisisbleTo 的文档此后已更新为 Friend Assemblies (C++) 的链接文件。

关于.net - InternalsVisibleTo 不适用于托管 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/417842/

相关文章:

c# - 索引器 c# 中的 System.StackOverflowException

c# - 虚拟化统一网格

c# - 在 C# 中比较两个字符串数组

.net - 在 C++ 中实现 GetEnumerator

silverlight-4.0 - Silverlight 4 中的最小起订量内部接口(interface)。 "Can not create proxy for types that are not accessible."

.net - Nullable Enum 可空类型问题

opencv - 如何查找在C++/CLI中使用Contours方法OpenCV选择的随机形状对象的长度和宽度

generics - 通用类中的编译器错误c1001

c# - InternalsVisibleTo 属性问题

c# - 受信任的 pfx 证书无法与 InternalsVisibleTo 属性一起使用