鉴于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()
答案 0 :(得分:0)
尝试加载格式不正确的程序
该异常消息非常准确。 .lib文件确实不是正确的格式。只有链接器在创建具有正确格式的文件时才知道如何使用它们。一个DLL。
您需要在解决方案中创建另一个项目来创建DLL。需要从该DLL导出foo_method()。当你从.lib开始时,这往往有点棘手,你必须使用.def文件来命名导出。使用__declspec(dllexport)
更容易。不清楚你是如何得到.lib,但如果你自己构建它,那么你应该考虑改变项目,以便创建正确的可执行文件。一个DLL。