2010-02-04 12 views
5

Ich versuche, eine Delphi-Funktion aus C# ASP.NET-Code aufzurufen. Die Erklärung der Funktion sieht wie folgt aus:Aufrufen einer Delphi-DLL-Methode aus C# -Code

function SomeFunction(const someString, SomeOtherString: string): OleVariant; 

Von meinem C# -Code Ich habe diesen Code:

[DLLImport(MyDLL.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)] 
public static extern object SomeFunction(string someString, string SomeOtherString); 

Jedes Mal, wenn ich diese Methode aufrufen und speichern Sie es als ein Objekt, erhalte ich ein P/Fehler Invoke . Ich habe noch nie unmanaged Code von meinem C# aufgerufen, also bin ich irgendwie ratlos.

+0

Was ist der P/Invoke-Fehler, den Sie erhalten? =) – Rob

+0

Sie müssen Ihre Funktion als "Export" und "Stdcall" mindestens markieren. Zeigen Sie Ihren Gerätecode an, für den diese Funktion definiert ist. –

+0

[Siehe diese FAQ, die ich vor ein paar Tagen in Tek-Tips Foren geschrieben habe (Klick mich)] (http://tek-tips.com/faqs.cfm?fid=7416) –

Antwort

9

Sie können die DLL-Funktion nicht aufrufen, da es den Delphi-spezifischen string-Datentyp verwendet, der in Nicht-Embarcadero-Produkten keine Entsprechung hat. (Selbst wenn Ihr C# -Code die Struktur entsprechen kann von String-Typ Delphi, müssten Sie auch den Speicher zuzuweisen der Speicher-Manager DLL verwenden, die es mit ziemlicher Sicherheit nicht exportiert.)

Wenn Sie die Möglichkeit haben, Um die DLL zu ändern, geben Sie die Parameter PAnsiChar oder PWideChar ein. (Von Ihrer C# -Deklaration aus sieht es so aus, als wollten Sie PAnsiChar.) Das sollte die DLL die ganze Zeit benutzt haben.

Wenn Sie die DLL nicht ändern können, schreiben Sie eine Wrapper-DLL in Delphi oder C++ Builder, die PAnsiChar oder PWideChar verwendet, und leitet diese Parameter dann an die ursprüngliche Delphi-DLL weiter. Oder beschweren Sie sich lautstark beim DLL-Anbieter und fordern Sie eine neue Version an, die mit anderen Sprachen freundlicher ist.

0

Versuchen

[DLLImport(MyDLL.dll, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)] 
public static extern IntPtr SomeFunction(string someString, string SomeOtherString); 

und Marshal.GetObjectForNativeVariant mit dem Rückgabewert verwenden, um ein .NET-Objekt zu erhalten.

Verwandte Themen