Verwenden von Ctypes in Python, um auf die Methoden einer C # -Dll zuzugreifen

8

Ich möchte C # -Code in einem kritischen Teil meines Python-Programms implementieren, um es schneller zu machen. Es heißt (auf Python-Dokumentation und dies Website ), die Sie eine Dynamic Link Library (und damit die PyDocs) wie folgt laden können:

cdll.LoadLibrary("your-dll-goes-here.dll")

Dies ist der Teil meines Codes, der sich um diese Funktion kümmert:

%Vor%

Und die RECERCATOOLS.dll, die ich verwende, ist dies (C # -Code, nicht C oder C ++):

%Vor%

Um diese DLL zu erstellen, benutze ich den "Build" -Befehl über das Visual Studio 2010-Projekt, das nur diese Datei und einen Verweis auf "Karlstools" enthält, ein Modul, das es mir erlaubt, komplexe Zahlen zu verwenden.

Ich weiß nicht warum, aber wenn ich versuche, meinen Python-Code auszuführen, wird nur eine Ausnahme ausgelöst:

%Vor%

Ich brauche Hilfe dabei, da es mir immer Ausnahmen gibt, obwohl alles auf public und die Funktion static gesetzt ist, oder auch wenn ich versuche, direkt auf die Funktion zuzugreifen, ohne die Klasse "Program" anzugeben ... Ich habe keine Ahnung, wo das Problem sein könnte.

    
Daniel Torramilans 16.07.2011, 14:45
quelle

5 Antworten

7

Die Tipps, die Sie beim Aufruf von DLL aus Python mit ctypes finden, verlassen sich meistens darauf, dass die DLL in C oder C ++ und nicht in C # geschrieben ist. Mit C # ziehen Sie die gesamte Maschinerie der CLR ein, und die Symbole werden höchstwahrscheinlich gemangelt und nicht, was Ctypes erwarten, und Sie werden alle möglichen Probleme von der Garbage Collection Ihres Ausgangsarrays bekommen.

Ich hatte sehr gute Erfolge beim Python- und C # -Code-Interface, indem ich python für dot net ( Ссылка ) benutze Versuche dies.

Wenn Sie andererseits eine reine Performance anstreben, sollten Sie Ihren Code als native C-Erweiterung für Python mithilfe der Python / C-API neu schreiben ( Ссылка ).

    
gurney alex 17.07.2011, 11:50
quelle
8

Es ist eigentlich ziemlich einfach. Verwenden Sie einfach NuGet, um das "UnmanagedExports" -Paket zu Ihrem .Net-Projekt hinzuzufügen. Einzelheiten finden Sie Zypern .

Sie können dann direkt exportieren, ohne eine COM-Ebene erstellen zu müssen. Hier ist der Beispiel-C # -Code:

%Vor%

Sie können dann die DLL laden und die exponierten Methoden in Python aufrufen (funktioniert für 2.7)

%Vor%     
Rob Deary 24.04.2015 19:14
quelle
3

Andere haben darauf hingewiesen, dass eine C # DLL nicht wie eine native DLL behandelt werden kann.

Eine Option, die Sie haben, besteht darin, Ihre C # -Funktionalität als ein COM-Objekt zu exportieren, das von Python leicht verwendet werden kann.

Persönlich würde ich eine native Code-Lösung in Betracht ziehen, aber Sie könnten zu sehr auf C # festgelegt sein, um in diesem Stadium den Kurs zu ändern.

    
David Heffernan 17.07.2011 12:39
quelle
1

ctypes dient zum Laden von in C geschriebenen Shared Libraries (oder zumindest Shared Libraries, die direkt von der CPU ausführbar sind und ihre Symbole und Funktionsargumente gemäß den C-Standardkonventionen exportieren.) C # DLLs sind keine "normalen" DLLs. sondern eher in einer .NET-Umgebung ausgeführt werden sollte.

Ihre Optionen sind:

  1. Verwenden Sie eine Art von Python zu .NET Bridge.
  2. Schreiben Sie die DLL in C und verwenden Sie ctypes , um die Funktion aufzurufen und die Datenkonvertierungen zu übernehmen.
  3. Verwenden Sie die Python / C-API und erstellen Sie ein ladbares Python-Modul.

Ich kann nicht mit Option # 1 sprechen, ich habe es nicht getan. Option # 2 ist normalerweise einfacher als Option # 3, da Sie reinen C-Code schreiben und mit ctypes einkleben. Option 3 bietet die beste Leistung aller drei Optionen, da sie den geringsten Anruf-Overhead hat und nativen Code auf dem Prozessor ausführt.

    
Mark Evans 17.07.2011 12:03
quelle
1

Eine C # -DLL wird wirklich als Assembly bezeichnet, also ist sie ganz anders. Wenn es keinen sehr wichtigen Grund gibt, schlage ich vor, dass Sie C ++ verwenden

    
Keith Kenny 27.11.2013 20:13
quelle

Tags und Links