2011-05-18 54 views
1

我在使用P/Invoke for C#时遇到了麻烦。下面是我试图从该.dll调用函数(用C++编写):对C#使用C++ .dll函数时BadImageFormatException错误?

string 
BeatTracker::getName() const 
{ 
    return "Tempo and Beat Tracker"; 
} 

这里是我试图调用这个函数代码:

[DllImport("qm-vamp-plugins.dll",EntryPoint="BeatTracker")] 
public static extern string getName(); 

public QMTempo() 
{ 
    Console.WriteLine(getName()); 
} 

似乎是什么错误?我得到一个BadImageFormatException。除了IDE给我的模糊名称之外,我怎么能知道将来的参考文献有哪些错误?顺便说一句,我正在使用Visual Studio 2008。

此外,我正在使用(但不知道是否正确)EntryPoint,让它知道我使用BeatTracker类中的getName函数(因为还有其他类的getName函数,它们包含在单个函数中。 dll文件)

谢谢!

回答

7

此异常可以由所使用的.NET运行PROC架构和导入的DLL之间的mismath引起一。

更确切地说:

你使用64位Windows?运行时默认情况下将运行在64位。如果您的C++库以32位编译,您将在加载库时收到BadFormatException。如果您的.NET应用程序运行32位,并且您的C++库编译的目标是x64,则情况也是如此。

如果你可以重新编译这个库,那就去做吧。否则,您可以强制.NET运行时在编译时使用指定的体系结构,但会阻止它在其他体系结构上运行。这是你的选择;)当对.NET或java进行编码时,我们往往忘记了底层真正发生了什么。

+0

嗨!这似乎是问题!谢谢!它的固定现在(但后来我得到新的错误) – user488792 2011-05-18 09:02:32

2
[DllImport("qm-vamp-plugins.dll",EntryPoint="BeatTracker")] 

EntryPointgetName(),不BeatTracker这是一类!

但即便如此,你不能称之为,因为getName()是成员函数,它是不能没有实例调用。

所以我建议在DLL中定义自由函数并导出它们。您可以在DLL内部使用类。你可以使用类的句柄。

实施例,

DLL的代码:

typedef BeatTracker* PBeatTracker; 
typedef PBeatTracker HBeatTracker; 

//exported functions 
HBeatTracker CreateBeatTracker() 
{ 
     return new BeatTracker(); 
} 
void DeleteBeatTracker(HBeatTracker handle) 
{ 
    delete handle; 
} 
string getName(HBeatTracker handle) 
{ 
    return handle->getName(); 
} 

C#代码:

[DllImport("qm-vamp-plugins.dll",EntryPoint="CreateBeatTracker")] 
public static extern IntPtr CreateBeatTracker(); 

[DllImport("qm-vamp-plugins.dll",EntryPoint="DeleteBeatTracker")] 
public static extern void DeleteBeatTracker(HBeatTracker); 

[DllImport("qm-vamp-plugins.dll",EntryPoint="getName")] 
public static extern string getName(); 

public QMTempo() 
{ 
    IntPtr handle = CreateBeatTracker(); 
    Console.WriteLine(getName(handle)); 
    DeleteBeatTracker(handle); 
} 
+1

尽管这并没有解释BadImageFormatException(也就是说,正如Maupertuis所指出的那样,可能是32/64位不兼容),但这肯定是user488792将要获得的下一个问题,所以+1 :) – OregonGhost 2011-05-18 08:48:55

+0

然后,编组返回值将不得不被解决 – 2011-05-18 08:52:34

+0

@David:哪个?请随意编辑帖子。我不是p/invoke的专家,所以我可能不会自己解决编组问题(截至目前)。 – Nawaz 2011-05-18 08:55:29