【问题标题】:Type '<Module>' from assembly ... contains more methods than the current implementation allows来自程序集的类型“<Module>”...包含比当前实现允许的方法更多的方法
【发布时间】:2015-06-25 13:53:20
【问题描述】:

我正在尝试使用 /clr 标志在 visual-studio-2013 中编译一个相对较大的遗留 c++ 项目。项目生成一个dll。

我得到以下运行时异常:

Type '&lt;Module&gt;' from assembly ... contains more methods than the current implementation allows

我必须补充一点,这仅发生在调试配置中(发布 - 有效)。此外,该项目大量使用模板和宏,(我想)这有助于生成大量的方法......

几乎没有关于这个问题的文档。 我从网上搜到的(不知道是否准确)是:

在一个 clr dll 中有 ~65K 方法的限制。所有原生类的所有方法都进入了一些特殊的&lt;Module&gt;,因此它构成了全局限制。

一个建议是拆分项目,但由于类间依赖关系,这并不是很简单。我想这是可行的......

任何帮助将不胜感激。

【问题讨论】:

  • 如果是原生C++项目,不能用clr选项转换成托管C++项目
  • 问题是你可以。这是使 C++ 在 .NET 程序中可用的粗暴大锤方法造成的问题。正确隔离遗留的 C++ 代码会陷入成功的陷阱。将其编译成静态库没有 /clr,将其链接到仅包含 ref 类包装器的 C++/CLI 项目。
  • 我认为我不能接受您的建议的几个原因。首先,我需要运行代码覆盖,它可能不起作用(不确定)。其次,该库是以使用 dllexport/dllimport 约定的方式编写的,所以我需要更改它(虽然有一个宏,所以它可能并不昂贵)。第三,我认为最重要的是——许多函数是在库的头文件中实现的,因此一些代码将使用 /clr 编译,而其余的将在没有它的情况下编译。因为这个,我已经看到了看起来像木头的虫子。顺便说一句 - 尝试过 Gf 标志 - 没有帮助。

标签: c++ .net clr


【解决方案1】:

我最终将代码分成两个 dll,并删除了一些我没有使用的代码。困难的部分是识别“死”代码并确保它广泛使用模板(否则我只是删除桶中的水滴)。

我知道这不是您想听到的解决方案,但我找不到任何其他可行的解决方法。

【讨论】:

    【解决方案2】:

    我在 VS2015 上已经为这个问题苦苦挣扎了几个星期。最后我找到了链接器选项:/OPT:REF,它可以在Project properties-&gt;Linker-&gt;Optomization-&gt;References 下找到。这从输出 DLL 的大小中删除了大约 12MB,并且在运行时不再抛出异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-09
      相关资源
      最近更新 更多