P /调用具有可变参数签名的函数

时间:2010-12-15 23:01:42

标签: c# compact-framework pinvoke variadic

我有一个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

2 个答案:

答案 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));