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.
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 ( Ссылка ).
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%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.
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:
ctypes
, um die Funktion aufzurufen und die Datenkonvertierungen zu übernehmen. 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.
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