4

在我从 XP 迁移到 Vista 之后,我意识到我的 C# 程序不起作用。

情况是这样的:我编写了一个 C++ dll,在我的 C# 应用程序中使用。该 DLL 在 XP 中运行良好,但是当我迁移到 Vista 时,它不再在 C# 中运行。

我在 Delphi 中对其进行了测试,工作正常,但是 C# - 没有。

我编写了额外的代码以使我在 C# 中的检查更容易。

        if (LoadLibrary("blowfish.dll") == 0)
        {
            Misc.LogToFile("error", true);
            Application.Exit();
        }

它不需要 C++ 运行时,因为它是使用库编译的,并且可以在 Vista 上的 Delphi 中运行,但不能在 C# 中运行。

问题可能出在哪里?

提前致谢。

4

3 回答 3

11

在 x64 平台上,JIT 会将您的程序编译为 x64,因为您的本机 C++ 编译为 x86,它将无法加载它。
您需要明确告诉 JIT 将您的程序编译为 x86,您可以使用CorFlags或项目设置将 CPU 类型设置为 x86(在 Build/Platform 目标下)

于 2009-07-12T16:57:20.843 回答
2

Shay 有一个快速的解决方法——让你的整个应用程序是 32 位的,这样它就可以在 WOW64 下运行。

但是,“更好”的解决方案是将您的 C++ dll 重新构建为 64 位代码,以便您的整个程序可以在 64 位操作系统上本地运行。

于 2009-07-12T20:06:59.293 回答
1

如果您正常编译,CLR 将在 x64 Windows 上以 64 位运行您的应用程序,在 x86 Windows 上以 32 位运行您的应用程序。您必须为平台加载正确的本机映像。一种解决方案是按照 Shay 的建议进行操作,并强制您的应用程序在 32 位 CLR 中运行。

您还可以让您的应用程序查看本机指针大小并加载正确的本机图像。

string blowfishdll = "blowfish.dll";
// detect 64-bit installations by looking at the native pointer size
if( 64 == IntPtr.Size * 8  )
    blowfishdll = "blowfish-x64.dll"

if (LoadLibrary( blowfishdll ) == 0)        
{
    Misc.LogToFile("error", true);            
    Application.Exit();        
}
于 2009-07-13T01:38:44.477 回答