Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/audio/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual c++ C++/CLI包装DLL TypeLoadException字段过多 我有一些本地的非托管C++ DLL,它们被一个通过.LIB文件链接的C++ c/dll链接起来。这些非托管C++ DLL有很多类,它们有很多方法,一个吨的const数据,例如字符串、十六进制值等,它们是在包含的报头中定义的。_Visual C++_C++ Cli - Fatal编程技术网

Visual c++ C++/CLI包装DLL TypeLoadException字段过多 我有一些本地的非托管C++ DLL,它们被一个通过.LIB文件链接的C++ c/dll链接起来。这些非托管C++ DLL有很多类,它们有很多方法,一个吨的const数据,例如字符串、十六进制值等,它们是在包含的报头中定义的。

Visual c++ C++/CLI包装DLL TypeLoadException字段过多 我有一些本地的非托管C++ DLL,它们被一个通过.LIB文件链接的C++ c/dll链接起来。这些非托管C++ DLL有很多类,它们有很多方法,一个吨的const数据,例如字符串、十六进制值等,它们是在包含的报头中定义的。,visual-c++,c++-cli,Visual C++,C++ Cli,但是对于C++/CLI包装DLL,它只是本机DLL的包装和编组层。但是,它的二进制大小与本机dll一样大。 我相信这会导致我达到硬编码限制,在C应用程序加载异常时会抛出异常: System.TypeLoadException:内部限制:字段太多 C应用程序永远不会使用本机DLL的标头中定义的字段 它能够通过启用字符串池来缓解这个问题,减少了几MB的内存,但它看起来像是一个黑客 为什么DLL的简单包装器与该DLL的大小相同?有没有一种方法可以标记常量数据,这样C应用程序就不会加载它们 为什么DLL

但是对于C++/CLI包装DLL,它只是本机DLL的包装和编组层。但是,它的二进制大小与本机dll一样大。 我相信这会导致我达到硬编码限制,在C应用程序加载异常时会抛出异常: System.TypeLoadException:内部限制:字段太多

C应用程序永远不会使用本机DLL的标头中定义的字段

它能够通过启用字符串池来缓解这个问题,减少了几MB的内存,但它看起来像是一个黑客

为什么DLL的简单包装器与该DLL的大小相同?有没有一种方法可以标记常量数据,这样C应用程序就不会加载它们

为什么DLL的简单包装器与该DLL的大小相同?有没有一种方法可以标记常量数据,这样C应用程序就不会加载它们

这通常是因为您使用/CLR编译整个项目

如果您非常小心地只将绝对最低要求包含到使用/CLR编译的.cpp文件中,并且只编译使用/CLR管理的类的.cpp文件,那么包装器项目往往会简单得多,而且更小。主要问题是A/CLR编译的.CPP文件使用的任何标题都为所有C++类型创建代理类型,这些类型可以在程序集中爆炸成大量的字段或类型。 使用隐藏本机代码和不透明指针还可以显著减少向程序集的托管部分公开的类型数,因为这允许您在托管代码中不包含主标头

为什么DLL的简单包装器与该DLL的大小相同?有没有一种方法可以标记常量数据,这样C应用程序就不会加载它们

这通常是因为您使用/CLR编译整个项目

如果您非常小心地只将绝对最低要求包含到使用/CLR编译的.cpp文件中,并且只编译使用/CLR管理的类的.cpp文件,那么包装器项目往往会简单得多,而且更小。主要问题是A/CLR编译的.CPP文件使用的任何标题都为所有C++类型创建代理类型,这些类型可以在程序集中爆炸成大量的字段或类型。
使用隐藏本机代码和不透明指针还可以显著减少程序集托管部分所公开的类型数,因为这允许您在托管代码中不包含主头。

您正陷入一个非常常见的陷阱,C++/CLI编译器工作得太好了。它能够编译任何C++ 03兼容的本地C++代码到IL,当PrimaMalor或CLR生效时。在运行时也能很好地工作,它通过机器代码的抖动及时编译,就像常规托管程序一样

这是个好消息。坏消息是,此代码的执行方式与托管代码不同。它没有得到验证,也没有得到垃圾收集器的喜爱。它也不像常规编译的C++代码那样运行效率高,你错过了C++代码优化器可用的额外时间,得到绝对最好的机器代码。 还有一个限制让你的程序爆炸。任何全局变量和自由函数都编译为隐藏类的成员。必需,因为CLR不支持全局。托管类的成员将获得元数据标记,该标记是在元数据表中唯一标识它们的数字。令牌是一个32位的值,低16位用于对其进行编号。当您创建了一个成员数超过65535的类时


显然,这一切都是不可取的。您需要更加注意哪些代码被编译成IL,哪些代码被编译成机器代码。您的本机C++源代码应该在没有/CLR选项的情况下编译。按住Shift键并单击“选择这些文件”并设置选项。如有必要,使用pragma un/managed在一个源代码文件中来回切换编译器。

您陷入了一个非常常见的陷阱,C++/CLI编译器工作得太好了。它能够编译任何C++ 03兼容的本地C++代码到IL,当PrimaMalor或CLR生效时。在运行时也能很好地工作,它通过机器代码的抖动及时编译,就像常规托管程序一样

这是个好消息。坏消息是,此代码的执行方式与托管代码不同。它没有得到验证,也没有得到垃圾收集器的喜爱。它也不会运行 与常规编译的C++代码一样,你错过了C++代码优化器可用的额外时间,得到绝对最好的机器代码。 还有一个限制让你的程序爆炸。任何全局变量和自由函数都编译为隐藏类的成员。必需,因为CLR不支持全局。托管类的成员将获得元数据标记,该标记是在元数据表中唯一标识它们的数字。令牌是一个32位的值,低16位用于对其进行编号。当您创建了一个成员数超过65535的类时


显然,这一切都是不可取的。您需要更加注意哪些代码被编译成IL,哪些代码被编译成机器代码。您的本机C++源代码应该在没有/CLR选项的情况下编译。按住Shift键并单击“选择这些文件”并设置选项。如有必要,请使用pragma un/managed在一个源代码文件中来回切换编译器。

谢谢。本机代码在不支持/clr的情况下编译,并打包到DLL中。C++/CLI包装器是使用/clr支持编译的。这不管用吗?C++/CLI包装器只有托管类,但这不是异常所说的。检查你的假设。如果在C++/CLI源代码文件中包含本地C++代码的头,它们不只是普通C++类,那么您可能需要将它们封装在PrimaMaultAddioPress、Office和PrimMaMultudiePOP中,这样编译器就知道这些头包含非托管声明。DLLB.dll通过DLLA.lib链接到DLLA.dll。DLLB.dll的VS2010项目包括用于构建DLLA.dll的头文件。DLLB.dll支持/clr,并且只包含调用DLLA.dll函数的ref类。C应用程序在DLLB.dll中添加并调用托管类中的函数。我不知道我把事情搞砸了。我将尝试将这些标题声明为非托管。谢谢您的帮助!我发现了这个问题,包装纸的尺寸明显下降。这是由于一个遗留头文件具有循环include,其中头文件列出了许多头文件。如果您不知道,代码库编写得很糟糕:。我不确定使用C++/CLI会有什么影响,但一旦我删除它,文件大小就会大大减小。谢谢。本机代码在不支持/clr的情况下编译,并打包到DLL中。C++/CLI包装器是使用/clr支持编译的。这不管用吗?C++/CLI包装器只有托管类,但这不是异常所说的。检查你的假设。如果在C++/CLI源代码文件中包含本地C++代码的头,它们不只是普通C++类,那么您可能需要将它们封装在PrimaMaultAddioPress、Office和PrimMaMultudiePOP中,这样编译器就知道这些头包含非托管声明。DLLB.dll通过DLLA.lib链接到DLLA.dll。DLLB.dll的VS2010项目包括用于构建DLLA.dll的头文件。DLLB.dll支持/clr,并且只包含调用DLLA.dll函数的ref类。C应用程序在DLLB.dll中添加并调用托管类中的函数。我不知道我把事情搞砸了。我将尝试将这些标题声明为非托管。谢谢您的帮助!我发现了这个问题,包装纸的尺寸明显下降。这是由于一个遗留头文件具有循环include,其中头文件列出了许多头文件。如果您不知道,代码库编写得很糟糕:。我不确定使用C++/CLI会有什么影响,但一旦我删除它,文件大小就会大大减小。