启用生成序列化程序集时使用 C++/CLI dll
Using C++/CLI dll when generate serialization assembly is enabled
我有一个 C++/CLI dll 包装了一些我想在 C# 项目中使用的本机 C++ 代码。
如果 Generate serialization assembly
属性 设置为 Auto
或 Off
,一切正常。但是,当我将此 属性 设置为 On
时,出现以下错误:SGEN : error : An attempt was made to load an assembly with an incorrect format: example.dll
是否有不需要禁用序列化程序集的解决方案?
您的 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。
我有一个 C++/CLI dll 包装了一些我想在 C# 项目中使用的本机 C++ 代码。
如果 Generate serialization assembly
属性 设置为 Auto
或 Off
,一切正常。但是,当我将此 属性 设置为 On
时,出现以下错误:SGEN : error : An attempt was made to load an assembly with an incorrect format: example.dll
是否有不需要禁用序列化程序集的解决方案?
您的 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。