使用/ CLR编译的MFC项目中是否有任何类计数限制

Huo*_*rds 2 debugging clr mfc c++-cli visual-studio-2013

随着风险陷入过于具体的问题......

给定用/ CLR编译的C++ MFC(混合,非抖动)项目,我已经定义了200个类.

当我为这个项目添加一个新的类时,当我在调试模式下编译和执行时会出错.

未知模块中出现未处理的"System.IO.FileLoadException"类型异常.

附加信息:无法加载文件或程序集"ProjectA,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null"或其依赖项之一.无法找到或加载类型.(来自HRESULT的异常:0x80131522)

ProjectA是MFC项目本身的名称.没有ProjectA对项目配置上的任何程序集的引用,也没有对另一个自定义程序集的引用.

此项目仅引用某些.NET Framework程序集,以便允许项目中的某些自定义类可以使用CLR类.

然后,问题是......

  • 您知道MFC C++项目中是否有类号限制吗?

编辑:

正如我在评论中所说,在发布模式下,编译成功没有错误.

此外,我清理,构建,清理,关闭Visual Studio,重新启动计算机......问题仍然出现.如果我保留200个班级,则没有错误.当我转到201时,出现错误.

目前我正在尝试在一个新的默认MFC项目中重现,添加类到达到200,以确认存在真正的限制.

编辑2:错误修复

大.@MSX@frymode告诉我如何避免他的评论错误.

在Visual Studio开发环境(/)中:

  1. 打开项目的"属性页"对话框.
  2. 单击C/C++文件夹.
  3. 单击"代码生成"属性页.
  4. 修改启用字符串池(/ GF)属性.

感谢你们!

Han*_*ant 5

/ GF hack是解决此问题的已知解决方法.然而,这是不正确的,你正在为一个严重出血的伤口放一个创可贴.非常重要的是,您可以修复问题而不是在其上添加补丁,这会严重影响程序在运行时的运行方式.

问题制定者是<Module>类,C++/CLI编译器生成的内部类.你可以用ildasm.exe或一个好的反编译器看到它.此类是程序中非类成员声明的主页,在本机C++中有效但CLR不支持.这要求每个变量或函数声明都是类的成员.C++/CLI编译器通过将这样的声明移动到<Module>类中来解决它.

但是,类中的成员数量有限制,它们在带有元数据标记的.NET程序集的元数据中表示.其他表的索引.高字节标识表号,低字节是表中的索引.

你超过了这个限制.这是不好的.

/ clr编译选项的一个问题是它运行得很好.它能够将任何符合C++ 03的本机C++代码编译到MSIL.这些代码将通过抖动及时编译为机器代码,就像普通的托管代码一样.然而,它不是可验证的代码,它根本不像托管代码那样,你可以用指针弄乱你的程序.最重要的是,它不是使用本机C++后端进行优化的代码.只有抖动优化器能够改进代码,它几乎无法完成原生C++优化器可以完成的质量工作,因为它运行的硬件上限可以花费多少时间来完成这项工作.

看一下反编译器,看看那个<Module>课程结束了什么.一开始就是压倒性的,你知道你现在有一个大的.您通过花费更多时间将代码分离到托管部分和本机部分来解决此问题.应该在没有/clr生效的情况下编译本机代码.它是一个按源文件设置,您甚至可以使用#pragma managed在单个源代码文件中来回切换.最简单的隔离方法是将您的本机代码保存在自己的库或DLL中.