无法在 Vista x64 的 C# 应用程序中加载 C++ DLL

Posted

技术标签:

【中文标题】无法在 Vista x64 的 C# 应用程序中加载 C++ DLL【英文标题】:Unable to load C++ DLL in C# application in Vista x64 【发布时间】:2008-12-04 14:07:19 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

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

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

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

【讨论】:

您的帖子中有一个小错误 - 32 位进程仅加载 32 位(而不是 64 位)DLL。但是感谢您的帖子,这很有用,我实际上并不知道背景,只知道修复。【参考方案3】:

需要在客户端机器上安装 VC90 for x64 的 redist。就清单而言,我认为您可以对其进行更改以删除 processorArchitecture 标记。或者说“任何”。

【讨论】:

你是对的 - 我没有在客户端机器上安装 VC90 redist。愚蠢的错误! :)【参考方案4】:

如果没有其他方法.. 你可以试试Process Monitor。 它会向您显示未找到哪个文件(依赖项)。这可能会引导您继续进行。

【讨论】:

【参考方案5】:

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

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

【讨论】:

以上是关于无法在 Vista x64 的 C# 应用程序中加载 C++ DLL的主要内容,如果未能解决你的问题,请参考以下文章

无法在 GlowCode x64 中加载符号

NUnit 不能在 Visual Studio 2003 中的 Vista x64 上运行

Windows Vista 产品兼容性讲座 - 对可执行文件签名 Code signing Procedure

找不到指定的模块 - 64 位 dll

无法在 c# 项目中加载 cvextern

失望的Vista SP1