代码之家  ›  专栏  ›  技术社区  ›  Rob Prouse

内部管理不适合托管C++

  •  12
  • Rob Prouse  · 技术社区  · 17 年前

    VisualButo不是为我的托管C++项目工作,而是用于我的C项目。任何帮助都将不胜感激。这是一个简化的布局。

    A. -C#,有一个我想从中访问的内部属性 B/C
    项目 B -管理C++。工具书类 .
    A.

    所有项目都使用相同的密钥签名。使用ILDASM或Reflector查看编译后的程序集,可以看出它们都已正确签名(当我注释掉内部属性用法时)。

    在项目中的AssemblyInfo.cs中 A.

    [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++来工作的。是否有bug或其他我需要做的事情?

    是否有其他方法可以保护属性,使其只能由我签名的程序集使用?我知道我可以保护我所有的程序集,但是我可以在这样的粒度级别上做吗?

    根据MSDN中的注释,我将属性更改为以下内容,但仍然不起作用。

    [assembly: InternalsVisibleTo( "B, " +
       "PublicKey=00240000048000009400000006020000002400005253413100040000010001007" +
       "50098646D1C04C2A041FAAF801521A769535DE9A04CD3B4DEDCCBF73D1A6456BF4FE5881451" +
       "0E84983C72D0460B8BA85C52A9CACDC4A0785A08E247C335884C2049ECFE6B2C5E20A18FE4B" +
       "9BFF009ADA232E980D220B3C9586C9C5EE29C29AEE8853DB7BB90CF5A4C704F5244E1A1085C" +
       "4306008535049A0EBB00FE47E78DCB" ),
    InternalsVisibleTo( "C, " +
       "PublicKey=00240000048000009400000006020000002400005253413100040000010001007" +
       "50098646D1C04C2A041FAAF801521A769535DE9A04CD3B4DEDCCBF73D1A6456BF4FE5881451" +
       "0E84983C72D0460B8BA85C52A9CACDC4A0785A08E247C335884C2049ECFE6B2C5E20A18FE4B" +
       "9BFF009ADA232E980D220B3C9586C9C5EE29C29AEE8853DB7BB90CF5A4C704F5244E1A1085C" +
       "4306008535049A0EBB00FE47E78DCB" )]
    
    1 回复  |  直到 11 年前
        1
  •  28
  •   Rob Prouse    9 年前

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

    #using <A.dll> as_friend
    

    然后还需要更改程序集搜索路径,以包括项目A的生成目录。

    被管理C++作为第二类语言的断裂和典型 . 如果无法执行项目引用,则最终将引用build debug或release目录中的程序集。这会打破依赖关系,当您将配置从调试更改为发行版时,让它引用正确DLL的唯一方法是使用丑陋的#IFDEF debug和#using的相对路径。

    我也很失望,在报告中没有提到这一点 InternalsVisibleToAttribute C++ documentation 查找信息。

    编辑 :有关 InternalsVisisbleTo 已更新为指向的链接 Friend Assemblies (C++) 文件

        2
  •  0
  •   whats_wrong_here    6 年前

    注:

    也许有人会帮助你,不要将手工引用添加到“#using as_friend”中包含的库中,因为如果它保留在这样的引用中,它可能不会被编译。

    在#using指令之后,让.NET机械学自行决定如何处理这个库。

    推荐文章