我有一个C#.NET 2.0 CF应用程序,它使用以下签名从本机DLL导入函数:
__declspec( dllexport ) void DLL_Foo( int count, ... );
我的C#应用程序P /调用函数如下:
public sealed class MyObject
{
public void Foo()
{
NativeMethods.DLL_Foo(2, __arglist("a","b"));
}
internal static class NativeMethods
{
[DllImport("My.dll")]
internal static extern void DLL_Foo(int count, __arglist);
}
}
但是,当我调用MyObject.Foo
时,我会得到System.MissingMethodException
。
我需要做些什么来改变这项工作?
谢谢, PaulH
修改:如果我将导入定义更改为:
internal static extern void DLL_Foo(int count, [MarshalAs(UnmanagedType.LPWStr)]string a, [MarshalAs(UnmanagedType.LPWStr)]string b);
然后,打电话:
NativeMethods.DLL_Foo(2, "a", "b");
它没有任何问题,因此我使用__arglist
。
答案 0 :(得分:1)
我不确定(我从来没有这样做过)如果你可以在P / Invoke中拥有params
args,但你可以尝试一下。
internal static extern void DLL_Foo(int count, params string[] args);
答案 1 :(得分:0)
您应该将CallingConvention = CallingConvention.Cdecl
用于DllImport。 CallingConvention.Cdecl
描述说明了这一点。
using LPWORD = System.IntPtr;
using LPVOID = System.IntPtr;
[DllImport("foo.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern LPVOID extFunc(LPWORD lpdwMandatory,__arglist);
然后你可以调用 extFunc 函数:
extFunc(lp1,__arglist( 0xFF,0x6A,0xAA));