0

次の署名を持つネイティブDLLから関数をインポートするC#.NET2.0CFアプリケーションがあります。

__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使用法に何かあります。

4

2 に答える 2

1

paramsP/Invoke で引数を使用できるかどうかはわかりませんが (実際に行ったことはありません) 、試してみてください。

internal static extern void DLL_Foo(int count, params string[] args);
于 2010-12-15T23:30:56.453 に答える
0

CallingConvention = CallingConvention.CdeclDllImportに使用する必要があり ます。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));
于 2012-08-31T10:05:33.270 に答える