【问题标题】:Using C++/CLI dll when generate serialization assembly is enabled启用生成序列化程序集时使用 C++/CLI dll
【发布时间】:2016-02-22 12:56:09
【问题描述】:

我有一个 C++/CLI dll 包装了一些我想在 C# 项目中使用的本机 C++ 代码。

如果Generate serialization assembly 属性设置为AutoOff,一切正常。但是,当我将此属性设置为 On 时,出现以下错误:SGEN : error : An attempt was made to load an assembly with an incorrect format: example.dll

任何不需要禁用序列化程序集的解决方案?

【问题讨论】:

    标签: c# .net dll c++-cli interop


    【解决方案1】:

    您的 C++/CLI 程序集包含非托管代码,它只能由以相同目标体系结构运行的程序加载。 SGen 加载它以访问元数据。 SGen.exe 有两个版本,一个 32 位版本和一个 64 位版本。

    因此,如果 32 位版本的 SGen 尝试加载 C++/CLI 程序集的 x64 版本,则会出现此错误。或者反过来。您可以通过查看详细的 MSBuild 跟踪并注意 sgen.exe 路径来诊断它。工具 > 选项 > 项目和解决方案 > 构建和运行 > MSBuild 项目构建输出详细程度 = 详细。 sgen.exe 的 32 位版本位于“NETFX 4.x Tools”目录中,64 位版本位于“NETFX 4.6 Tools\x64”目录中。

    当您没有将 C# 项目配置为与 C++/CLI 项目的目标体系结构兼容时,您会得到该工具的错误位数。右键单击它 > 属性 > 构建选项卡 > 平台目标设置。使其与您的 C++/CLI 项目目标相匹配。如果您选择 x86 或 AnyCPU,那么您将获得 32 位版本的 SGen,x64 会产生 64 位版本的 SGen。

    【讨论】:

    • 谢谢,我刚刚解决了。问题不在于您建议的 SGen 架构与我的应用程序之间的不匹配,但您的回答为我指明了正确的方向。 C++/CLI 程序集需要一些 3rdparty 程序集,这些程序集位于我的应用程序的 .exe 旁边。我只需要将它们放在 PATH 系统变量中,以便 SGen 可以找到它们。
    • 嗯,这会产生不同的异常。好吧,我猜只要它有效。
    • 通过从命令提示符运行 SGen.exe 它还显示 Could not load file or assembly example.dll or one of its dependencies. 这是我通常在找不到依赖项时遇到的错误。
    • 是的,这是您遇到的异常,而不是您在问题中询问的 BadImageFormatException。我想有两件事可能是错的:)
    猜你喜欢
    • 1970-01-01
    • 2016-10-25
    • 2012-07-14
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 2010-10-10
    相关资源
    最近更新 更多