在Vista x64下,LoadLibrary失败

时间:2009-07-12 16:33:47

标签: c# winapi loadlibrary

在我从XP迁移到Vista之后,我意识到我的C#程序无效。

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

我在Delphi中测试过,工作正常,但C# - 没有。

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

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

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

问题出在哪里?

提前致谢。

3 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:2)

Shay有快速解决方法 - 将整个应用程序设置为32位,以便在WOW64下运行。

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

答案 2 :(得分: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();        
}