P / Вызов функции с переменной сигнатурой - PullRequest
0 голосов
/ 16 декабря 2010

У меня есть приложение C # .NET 2.0 CF, которое импортирует функцию из собственной библиотеки DLL со следующей подписью:

__declspec( dllexport ) void DLL_Foo( int count, ... );

My 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 ]

1 голос
/ 16 декабря 2010

Я не уверен (и я никогда этого не делал), если вы можете иметь params args в P / Invoke, но вы можете попробовать.

internal static extern void DLL_Foo(int count, params string[] args);
0 голосов
/ 31 августа 2012

Вы должны использовать 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));
...