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

时间:2014-10-30 10:18:46

标签: debugging visual-studio-2013 mfc c++-cli clr

风险会陷入太具体的问题......

鉴于使用/ 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开发环境(source / source)中:

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

2 个答案:

答案 0 :(得分: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中。

答案 1 :(得分:2)

This link表明,命名空间(而不是项目)中的类型数量没有限制。考虑到命名空间可以在不同的程序集中拆分,至少在理论上,你可以拥有无​​限数量的类型。但是,this post确认.DLL中的最大类数 是16777215.也许,在达到这个数量的课程之前,你的内存会耗尽:)

仅供参考:不过,每个班级的字段数量似乎都有limit

P.S .: 以下是从this link

获取问题的解决方案
  1. 打开项目的“属性页”对话框。
  2. 单击C / C ++文件夹。
  3. 单击“代码生成”属性页。
  4. 修改Enable String Pooling属性。