2010-12-15 4 views
0

Ich habe eine C# .NET 2.0 CF-Anwendung, die eine Funktion von einem nativen DLL mit der folgenden Signatur importiert:P/Aufruf eine Funktion mit einer variadische Unterschrift

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

Meine C# Anwendung P/Ruft die Funktion als folgt:

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); 
    } 
} 

Aber, wenn ich MyObject.Foo aufrufen, ich System.MissingMethodException bekommen.

Was muss ich ändern, damit dies funktioniert?

Danke, PaulH


Edit: Wenn ich die Importdefinition zu ändern:

internal static extern void DLL_Foo(int count, [MarshalAs(UnmanagedType.LPWStr)]string a, [MarshalAs(UnmanagedType.LPWStr)]string b); 

dann rufen:

NativeMethods.DLL_Foo(2, "a", "b"); 

Es ohne Probleme funktioniert also ist es etwas mit meiner __arglist Verwendung.

Antwort

1

Ich bin mir nicht sicher (und ich habe es nie getan), wenn Sie params Args in P/Invoke haben können, aber Sie könnten es versuchen.

internal static extern void DLL_Foo(int count, params string[] args); 
+0

Das ist sehr interessant. Sobald ich zur 'NativeMethods.DLL_Foo (2, new string [] {" a "," b "})' Methode übergehe, gehe ich nicht weiter. Das Programm läuft weiter, wird jedoch nicht in der nächsten Codezeile fortgesetzt. Ich habe auch dies gegen 'wsprintf()' aus coredll.dll versucht, nur um sicher zu sein, es ist nicht die DLL unartig. Gleiches Ergebnis. – PaulH

+0

Oops. Ich hätte mir den Gerätebildschirm ansehen sollen. "Eine native Ausnahme ist in ... aufgetreten." Der Code ist 0x80000002, was meiner Meinung nach eine Fehlausrichtung des Datentyps ist. – PaulH

+0

@Paul Ich denke, Sie müssen wahrscheinlich eine Reihe von Überladungen mit mehreren Strings haben und das sollte den Trick tun - obwohl nicht erreichen, was Sie wollten. – Aliostad

0

Sie sollten CallingConvention = CallingConvention.Cdecl für Ihre DllImport verwenden. Die CallingConvention.Cdecl Beschreibung gibt es an.

using LPWORD = System.IntPtr; 
using LPVOID = System.IntPtr; 

[DllImport("foo.dll", CallingConvention = CallingConvention.Cdecl)] 
public static extern LPVOID extFunc(LPWORD lpdwMandatory,__arglist); 

Und dann können Sie rufen extfunc Funktion:

extFunc(lp1,__arglist(0xFF,0x6A,0xAA)); 
Verwandte Themen