【问题标题】:How to prevent the C++/CLI linker from removing unreferenced internal types?如何防止 C++/CLI 链接器删除未引用的内部类型?
【发布时间】:2012-08-14 14:12:55
【问题描述】:

我的 .NET 程序集中有一个非公共类型,我正在通过该程序集内部的反射加载该类型。

这在调试版本中效果很好,但在发布版本中,链接器会删除此类型,因为:

  • 它是内部的
  • 在程序集的代码中没有引用它

我可以为整个项目关闭此行为或将类型公开,但这不是我想要的。相反,我正在寻找一种方法来告诉链接器在任何情况下都添加类型。理想情况下,与System::Runtime::CompilerServices::DiscardableAttribute 完全相反。

【问题讨论】:

  • 您不能将 /OPT:REF 用于托管代码。如果属性中引用了删除的类型,链接器将生成无效的程序集。这可以说是一个错误,您可以将其发布到 connect.microsoft.com。不要期待奇迹。

标签: .net c++-cli visual-c++-2005


【解决方案1】:

最简单的方法是引用类型。 (我认为有理由使用反射来查找类型,而不是直接引用它。)您可以在进行反射的方法中执行此操作,或者在任何公共类型的静态构造函数中执行此操作。无论您在哪里执行此操作,只要您记录正在发生的事情以及您这样做的原因,就应该没问题。

Type^ keepThis = InternalOnlyClass::typeid; 在一个方法中可能就是你所需要的。如果编译器优化了该语句,那么internal: static Type^ keepThis = InternalOnlyClass::typeid; 应该可以解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多