Debugging 在使用/CLR编译的MFC项目中是否有类计数限制
有可能陷入太具体的问题Debugging 在使用/CLR编译的MFC项目中是否有类计数限制,debugging,visual-studio-2013,mfc,c++-cli,clr,Debugging,Visual Studio 2013,Mfc,C++ Cli,Clr,有可能陷入太具体的问题 给出了用/CLR编译的C++ MFC(混合、不摇动)项目,我已经定义了< 200 > 类。 当我向这个项目添加一个新的empty类时,当我在调试模式下编译和执行时,会出现一个错误 发生“System.IO.FileLoadException”类型的未处理异常 在未知模块中 其他信息:无法加载文件或程序集“ProjectA, Version=0.0.0.0,Culture=neutral,PublicKeyToken=null'或其 依赖关系。无法找到或加载类型。(HRES
给出了用/CLR编译的C++ MFC(混合、不摇动)项目,我已经定义了< 200 > <强>类。 当我向这个项目添加一个新的empty类时,当我在调试模式下编译和执行时,会出现一个错误
发生“System.IO.FileLoadException”类型的未处理异常 在未知模块中 其他信息:无法加载文件或程序集“ProjectA, Version=0.0.0.0,Culture=neutral,PublicKeyToken=null'或其 依赖关系。无法找到或加载类型。(HRESULT的例外情况: 0x80131522)ProjectA
是MFC项目本身的名称。项目配置中没有对任何ProjectA
程序集的引用,也没有对其他自定义程序集的引用
此项目仅引用某些.NET Framework程序集,以便允许项目中的某些自定义定义类可以使用CLR类
那么,问题是
-
你知道MFC C++项目中的班级号码是否有限制?
GF黑客是解决这个问题的一个已知的解决方法。然而,这并不是一个正确的方法,你在伤口上涂了创可贴。非常重要的一点是,您需要修复问题,而不是对其进行修补,这也会严重影响程序在运行时的运行方式 问题制造者是
类,它是C++/CLI编译器生成的内部类。您可以使用ildasm.exe或一个好的反编译器查看它。这个类需要作为程序中声明的类,而不是类成员,它们在本机C++中有效,但不被CLR支持。它要求每个变量或函数声明都是一个类的成员。C++/CLI编译器通过将此类声明移动到
类中来解决此问题
但是,类中的成员数量是有限制的,它们在.NET程序集的元数据中用元数据标记表示。其他表的索引。上面的字节表示表号,下面的字节表示表中的索引
你超过了限制。这很糟糕
/clr compile选项的一个问题是它工作得太好了。它能够编译任何C++ 03兼容的本地C++代码到MSIL。这样的代码会被抖动及时编译成机器代码,就像正常的托管代码一样。然而,它是不可验证的代码,并且根本不像托管代码,您可以用指针错误轻松地炸毁您的程序。最重要的是,它不是用本地C++后端优化的代码。只有抖动优化器有一个改进代码的方法,它不能完成本地C++优化程序所能做的几乎质量的工作,因为它在运行该工作上花费了多少时间。
用反编译器查看一下,看看在那个
类中得到了什么。一开始这会让人过度恐惧,你知道你现在有一个大问题。您可以通过花费更多时间将代码分为托管部分和本机部分来解决此问题。编译本机代码时不应使用/clr。这是一个基于源文件的设置,您甚至可以在单个源代码文件中使用#pragma managed来回切换。隔离的最简单方法是将本机代码保留在其自己的库或DLL中。在发布模式下是否会出现相同的问题?此外,是否尝试清理并重新生成?否,在发布模式下编译成功,没有错误。是的。我清理,生成,清理,关闭Visual Studio,重新启动计算机。。。如果我坚持200节课,就不会有错误。当我转到201时,出现错误。奇怪。。。有人通过以下步骤解决了这个问题:在VisualStudio开发环境中设置此编译器选项1。打开项目的“属性页”对话框。2.单击C/C++文件夹。3.单击代码生成属性页。4.修改启用字符串池(/GF)属性。在命令行属性页中设置/Gf。这是我们帮助的高兴。我们不能把它作为答案,因为解决方案没有回答你的问题,关于类号限制。你可以把问题留待别人回答。太好了!没有