当前位置:  开发笔记 > 编程语言 > 正文

InternalsVisibleTo不适用于托管C++

如何解决《InternalsVisibleTo不适用于托管C++》经验,为你挑选了1个好方法。

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文件中添加所需的引用.

#using  as_friend

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

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

我也很失望InternalsVisibleToAttribute文档中没有提到这一点.我需要深入研究C++文档以查找信息.

编辑:此后,InternalsVisisbleTo的文档已更新为指向朋友程序集(C++)文档的链接.



1> Rob Prouse..:

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

#using  as_friend

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

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

我也很失望InternalsVisibleToAttribute文档中没有提到这一点.我需要深入研究C++文档以查找信息.

编辑:此后,InternalsVisisbleTo的文档已更新为指向朋友程序集(C++)文档的链接.


FWIW,您不需要使用#ifdefs来引用正确的DLL.相反,您可以在项目属性,C/C++,常规,解析#using引用中设置#using引用的路径.在这里,您可以使用配置宏(例如$(ConfigurationName)和其他宏)来指定使用的程序集的路径.
推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有