【发布时间】:2015-06-25 13:53:20
【问题描述】:
我正在尝试使用 /clr 标志在 visual-studio-2013 中编译一个相对较大的遗留 c++ 项目。项目生成一个dll。
我得到以下运行时异常:
Type '<Module>' from assembly ... contains more methods than the current implementation allows
我必须补充一点,这仅发生在调试配置中(发布 - 有效)。此外,该项目大量使用模板和宏,(我想)这有助于生成大量的方法......
几乎没有关于这个问题的文档。 我从网上搜到的(不知道是否准确)是:
在一个 clr dll 中有 ~65K 方法的限制。所有原生类的所有方法都进入了一些特殊的<Module>,因此它构成了全局限制。
一个建议是拆分项目,但由于类间依赖关系,这并不是很简单。我想这是可行的......
任何帮助将不胜感激。
【问题讨论】:
-
如果是原生C++项目,不能用clr选项转换成托管C++项目
-
问题是你可以。这是使 C++ 在 .NET 程序中可用的粗暴大锤方法造成的问题。正确隔离遗留的 C++ 代码会陷入成功的陷阱。将其编译成静态库没有 /clr,将其链接到仅包含 ref 类包装器的 C++/CLI 项目。
-
我认为我不能接受您的建议的几个原因。首先,我需要运行代码覆盖,它可能不起作用(不确定)。其次,该库是以使用 dllexport/dllimport 约定的方式编写的,所以我需要更改它(虽然有一个宏,所以它可能并不昂贵)。第三,我认为最重要的是——许多函数是在库的头文件中实现的,因此一些代码将使用 /clr 编译,而其余的将在没有它的情况下编译。因为这个,我已经看到了看起来像木头的虫子。顺便说一句 - 尝试过 Gf 标志 - 没有帮助。