gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:27:18 24 4
gpt4 key购买 nike

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

给定一个使用/CLR 编译的 C++ MFC(混合,未动摇)项目,我已经定义了 200 个类。

当我向该项目添加一个新的类时,在 Debug模式下编译和执行时会出现错误。

An unhandled exception of type 'System.IO.FileLoadException' occurred in Unknown Module.

Additional information: Could not load file or assembly 'ProjectA, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. Could not find or load a type. (Exception from HRESULT: 0x80131522)

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

该项目只引用了一些.NET Framework 程序集,以允许项目中的一些自定义类可以使用CLR 类。

那么,问题是……

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

编辑:

正如我在评论中所说,在 Release模式下,编译成功且没有错误。

此外,我清理、构建、清理、关闭 Visual Studio、重新启动计算机……问题仍然存在。如果我保留 200 个类,则不会出现错误。当我转到 201 时,出现错误。

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

编辑 2:已修复错误

太棒了。 @MSX@frymode告诉我如何避免他的评论中的错误。

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

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

谢谢大家!

最佳答案

/GF hack 是解决此问题的已知解决方法。然而,这不是正确的,您正在将创可贴贴在严重流血的伤口上。解决问题而不是打补丁非常重要,这也会严重影响程序在运行时的运行方式。

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

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

您超出了该限制。这很糟糕。

/clr 编译选项的一个问题是它工作得太好了。它能够将任何 C++03 兼容的 native C++ 代码编译为 MSIL。此类代码将被抖动即时编译为机器代码,就像正常的托管代码一样。然而,它不是可验证的代码,而且它根本不像托管代码,你可以很容易地用指针错误来破坏你的程序。最重要的是,它不是使用 native C++ 后端优化的代码。只有抖动优化器有机会改进该代码,它几乎无法完成原生 C++ 优化器可以完成的质量工作,因为它在执行该工作所花费的时间上有一个硬性上限。

使用反编译器查看一下 <Module> 中的结果类(class)。一开始会让人不知所措,你知道你现在有一个大的。您可以通过花费更多时间将代码分为托管部分和 native 部分来解决此问题。 native 代码应该编译的地方 没有/clr 生效。这是一个针对每个源文件的设置,您甚至可以使用 #pragma managed 在单个源代码文件中来回切换。最简单的隔离方法是将 native 代码保存在其自己的库或 DLL 中。

关于debugging - 用/CLR 编译的 MFC 项目中是否有任何类数限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26650375/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com