32位dllimport在win7 x64平台上生成错误的格式错误(0x8007000b)

时间:2010-08-19 19:04:51

标签: c# migration 64-bit dllimport

我正在尝试在Win7 x64计算机上安装并运行32位应用程序。该应用程序是作为Win32应用程序构建的。它在32位平台上运行良好。在x64机器上,它在Programs(x86)目录中正确安装并运行正常,直到我调用32位dll。那时我得到错误的格式错误(0x8007000b),表明它正在尝试加载错误位数的dll。实际上,它试图从System32目录加载64位dll而不是SystemWOW64目录中的32位版本。

dll供应商提供的另一个32位应用程序正确运行,它确实从SystemWOW64目录加载32位dll。我没有他们的应用程序的源来看他们如何访问DLL。

我正在使用如下所示的DllImport函数来访问dll。有没有办法装饰DllImport调用强制它加载32位版本?

任何想法都赞赏。

谢谢,DP

public static class Micronas
{
    [DllImport(@"UAC2.DLL")]
    public static extern short UacBuildDeviceList(uint uFlags);
    [DllImport(@"UAC2.DLL")]
    public static extern short UacGetNumberOfDevices();
    [DllImport(@"UAC2.DLL")]
    public static extern uint UacGetFirstDevice();
    [DllImport(@"UAC2.DLL")]
    public static extern uint UacGetNextDevice(uint handle);
    [DllImport(@"UAC2.DLL")]
    public static extern uint UacSetXDFP(uint handle, short adr, uint data);
    [DllImport(@"UAC2.DLL")]
    public unsafe static extern uint UacGetXDFP(uint handle, short adr, IntPtr data);
}

3 个答案:

答案 0 :(得分:5)

强制您的.exe以32位模式运行。 Project + Properties,Build选项卡,Platform Target = x86。

避免对项目的平台设置感到困惑,它实际上不必与实际设置相匹配。这是Project + Properties,Build选项卡,Platform Target。那里有点乱。

答案 1 :(得分:0)

由于您的帖子标有C#,我假设这是一个.NET应用程序。它可能不是仅设置为32位。您可以通过在其上运行corflags.exe进行验证,并使用corflags /32bit+ myapp.exe在其上设置仅32位标志。如果修复它,您需要修复您的解决方案/项目以构建为x86而不是任何CPU。

答案 2 :(得分:0)

为了强制应用程序在64位平台上以32位模式运行,您可以在IIS应用程序池中进行设置:在高级设置中将“启用32位应用程序”设置为TRUE。