尝试使用C#中的第三方本机DLL,但遇到一个例外,即找不到DLL入口点,也不知道是什么原因。
dumpbin /exports
给我以下符号:?Foo@@YA_NPBDII0II_NMEEE01PAE@Z
。我用undname
解决了这个问题,该返回了:bool __cdecl Foo(char const *,unsigned int,unsigned int,char const *,unsigned int,unsigned int,bool,float,unsigned char,unsigned char, unsigned char,char const *,bool,unsigned char*)
因此,我尝试导入如下功能:
[DllImport("FooDll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] // evtl. __thiscall?, Charset?
private static extern bool Foo(string name, uint x, uint y, string app, uint width, uint height, bool switch, double factor,
byte r1, byte g1, byte b1, string store, bool switchBack, [In, Out] byte[] result);
我也尝试了CallingConvention = CallingConvention.ThisCall
并没有使用charset参数,但是发生了相同的异常。
有什么想法去哪里找?
答案 0 :(得分:0)
借助Wiktor和Hans的帮助,解决了入口点问题:
由于DLL似乎没有使用post_date_gmt
声明,因此有必要将输入点指定为DllImport
属性的参数,并使用修饰的/修饰的名称。此外,extern C
参数的类型必须为factor
(float
),以匹配堆栈上预期的参数长度。因此,C#代码现在看起来像这样:
System.Single