1

我有一个用 C++ 编写的 DLL,需要由 C# 中的应用程序使用。它在 Vista x86 下运行良好,但在 x64 下无法加载。因此,我构建了 DLL 的 x64 版本,并检测操作系统是 x86 还是 x64,并对适当的 DLL 使用适当的互操作调用。这在 Vista x86 下工作正常,但在 Vista x64 下,当它尝试加载 DLL 时出现“并排”错误。为什么它无法加载它,可以做些什么来纠正这个问题?(如果您需要更多信息,请告诉我,我不确定哪些信息与解决此问题相关。)

4

5 回答 5

4

第一个想法:您能否尝试将项目的 C# 部分中的“平台目标”设置为“x86”,看看它是否会在 Vista 64 机器上以 32 位兼容模式运行?

有关 SxS 错误的更多信息会很有用 - 它可能与未安装的某些特定(32 位?)运行时库版本有关?

于 2008-12-04T14:19:27.273 回答
3

MadKeithV 答案的一些进一步信息:

在 Windows x64 中,进程可以作为 32 位或 64 位进程启动。64 位进程只能加载 64 位 dll,32 位进程只能加载 32 位 dll。

如果您的 .Net 应用程序的平台目标(例如在项目属性中指定)设置为“任何 CPU”,则中间代码将根据目标平台编译为 32 位或 64 位代码,即在 x64 系统上,64 位代码将被生成。

因此,代码无法再加载 32 位 dll。

如果您的代码加载非托管程序集,您应该始终明确指定目标平台。

于 2008-12-04T14:48:53.750 回答
2

如果没有其他工作..你可以试试Process Monitor 。它向您显示未找到哪个文件(依赖项)..这可能会给您带来继续进行的机会。

于 2008-12-04T14:55:16.797 回答
2

需要在客户端计算机上安装适用于 x64 的 VC90 的 redist。就清单而言,我认为您可以对其进行更改以删除 processorArchitecture 标记。要么,要么让它说“任何”。

于 2008-12-04T20:41:31.497 回答
0

并排错误更可能是由您的 c++ dll 清单文件设置引起的,或者它们没有被嵌入,或者您选择不嵌入清单并且正在使用 32 位版本的清单。

简单的解决方案是将您的 c# 应用程序标记为 x86 杯并使用 32 位 dll 运行。

于 2008-12-04T14:52:49.610 回答