使用Platform Invoke时System.BadImageFormatException(HResult = -2147024885)

时间:2014-07-29 08:14:43

标签: c# c interop

鉴于C库,foo.lib和C#控制台应用程序bar.exe,我试图执行平台调用。但是,当从库中调用方法时,我一直收到以下异常

System.BadImageFormatException occurred
  HResult=-2147024885
  Message=An attempt was made to load a program with an incorrect format. (Exception from     HRESULT: 0x8007000B)

我已将编译器配置为将bar.exe构建为x64,而foo.lib是x64库。我已运行以下命令来确认此

>corflags bar.exe
Microsoft (R) .NET Framework CorFlags Conversion Tool.  Version  4.0.30319.1
Copyright (c) Microsoft Corporation.  All rights reserved.
Version   : v4.0.30319
CLR Header: 2.5
PE        : PE32+
CorFlags  : 1
ILONLY    : 1
32BIT     : 0
Signed    : 0

>dumpbin /headers foo.lib
...
File Type: LIBRARY

FILE HEADER VALUES
        8664 machine (x64)
           3 number of sections
    53B535D4 time date stamp Thu Jul 03 12:52:04 2014
         10E file pointer to symbol table
           8 number of symbols
           0 size of optional header
           0 characteristics
...

我确定foo.lib是正在加载的库,因为我尝试删除它,这会导致System.DllNotFoundException。

任何可能出错的想法都会受到高度赞赏。

修改 第一次尝试调用库时发生异常。我有一个带有以下声明的静态类

private static class NativeMethods
{
    private const string libname = "foo.lib";

    [DllImport(NativeMethods.libname)]
    public static extern void foo_method();
}

在第一次调用

时发生异常
NativeMethods.foo_method()

1 个答案:

答案 0 :(得分:0)

  

尝试加载格式不正确的程序

该异常消息非常准确。 .lib文件确实不是正确的格式。只有链接器在创建具有正确格式的文件时才知道如何使用它们。一个DLL。

您需要在解决方案中创建另一个项目来创建DLL。需要从该DLL导出foo_method()。当你从.lib开始时,这往往有点棘手,你必须使用.def文件来命名导出。使用__declspec(dllexport)更容易。不清楚你是如何得到.lib,但如果你自己构建它,那么你应该考虑改变项目,以便创建正确的可执行文件。一个DLL。