Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung des Prozesses zum Aufrufen der C#-Com-DLL-Komponente durch Python

Detaillierte Erläuterung des Prozesses zum Aufrufen der C#-Com-DLL-Komponente durch Python

黄舟
黄舟Original
2017-10-12 11:16:563678Durchsuche

Der folgende Editor bietet Ihnen ein praktisches Tutorial zum Aufrufen von C#-Com-DLL-Komponenten in Python. Der Herausgeber findet es ziemlich gut, deshalb teile ich es jetzt mit Ihnen und gebe es als Referenz. Folgen wir dem Herausgeber und werfen wir einen Blick darauf

Zuvor hatte das Unternehmen eine C#-AES-Verschlüsselungs- und Entschlüsselungslösung, aber die Lösung verwendete die Rijndael-Klasse für die Verschlüsselung anstelle der vier Modi von AES (ECB, CBC, CFB, OFB. Diese vier verwenden die RijndaelManaged-Klasse, und die Crypto-Bibliothek AES unter Python verfügt nur über diese vier Modi, und der Verschlüsselungseffekt der C#-AES-Rijndael-Klasse kann unter Python nicht erreicht werden.

Ähnlich wie bei dieser Funktion, die in C# erreicht, aber nicht in Python implementiert werden kann, gibt es zwei Lösungen zum Sammeln von Informationen. Die erste Möglichkeit besteht darin, IronPython zum direkten Aufrufen der C#-DLL-Datei zu verwenden im Internet, daher werde ich nicht auf Details eingehen. Ja, diese Methode verwendet ironPython anstelle von Python. Sie integriert nur einige Python-Versionen der .net-Framework-Bibliothek, die weniger Aktualisierungen und Wartung erfordert Die Methode besteht darin, den C#-DLL-Quellcode in eine COM-Komponente zu kompilieren und ihn dann in Python aufzurufen. Methoden der COM-Komponenten-DLL.

Es gibt viele Python-Tutorials zum Aufrufen von COM-DLLs im Internet, aber die meisten davon sind in C oder C++ geschrieben. Es gibt nur wenige umfassende Erklärungen zum Aufrufprozess von COM-Komponenten Zusammenfassung basierend auf meiner eigenen mehrtägigen Erkundungserfahrung. Stellen Sie vor, wie man COM-Komponenten generiert und COM-DLL-Komponenten mit Python aufruft. Teilen Sie sie mit allen.

Ich bin auch ein Neuling... ^ ^, Experten, bitte kommen Sie vorbei. Wenn in dem, was ich geschrieben habe, etwas falsch ist, verzeihen Sie mir bitte und korrigieren Sie mich...

1 .So generieren Sie eine C# COM-Komponente

Ich verwende zunächst Microsoft Visual Studio 2010 Erstellen Sie ein neues Projekt. Wählen Sie [Klassenbibliothek] aus, passen Sie den Namen an: ComToPython, klicken Sie auf [OK]

, um die CS-Datei umzubenennen: ComToPython.cs kann individuell angepasst werden. Wählen Sie im Popup-Fenster [Ja]

COM-Sichtbarkeit ist auf True eingestellt:

Das Obige entspricht den folgenden Projekteigenschafteneinstellungen:

Aktivieren Sie „Für COM-Interop registrieren“:

Neu erstellen Signatur ComToPythonKey und deaktivieren Sie „Passwortgeschützte Schlüsseldatei verwenden“

Schreiben Sie die Schnittstellenklasse IMyClass, und die ComToPython-Klasse implementiert die drei Methoden der Schnittstelle. Zum Beispiel die Add( )-Methode ist die Funktion, die wir implementieren möchten, und gibt a und b zurück.

Vor der ComToPython-Klasse muss [ClassInterface(ClassInterfaceType.None)] stehen, sonst wird beim Aufruf von Python ein Fehler gemeldet.

[ProgId("ComToPython.Application")] gibt den Namen an, wenn Python COM aufruft, der im nachfolgenden Python-Code angezeigt wird.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
 
namespace ComToPython
{
  [Guid("350779B9-8AB5-4951-83DA-4CBC4AD860F4")]
  public interface IMyClass
  {
    void Initialize();
    void Dispose();
    int Add(int x, int y);
  }
 
  [ClassInterface(ClassInterfaceType.None)]
  [Guid("16D9A0AD-66B3-4A8A-B6C4-67C9ED0F4BE4")]
  [ProgId("ComToPython.Application")]
  public class ComToPython: IMyClass
  {
    public void Initialize()
    {
      // nothing to do 
    }
 
    public void Dispose()
    {
      // nothing to do 
    }
 
    public int Add(int x, int y)
    {
      return x + y;
    }
  }
}

GUID wird mit dem Tool generiert, das mit VS2010 geliefert wird. Klicken Sie, um die beiden GUIDs zu kopieren und vor den beiden Klassennamen zu platzieren

Hinweis: Klicken Sie auf „Neue GUID“, um die neu erstellte GUID zu kopieren:

Schließlich wird F6 kompiliert, um die Lösung zu generieren, und debuggt es in Ihrem Projekt. Es wird ComToPython.dll im Verzeichnis generiert:

Der letzte Schritt besteht darin, die COM-Komponente im System zu registrieren

Start Menü – Öffnen Sie das CMD-Befehlsfenster, das mit VS 2010 geliefert wird (Administratorrechte). Suchen Sie den Ordner ComToPython.dll.

Ausführen: gacutil /i ComToPython.dll. DLL zum globalen Cache hinzufügen.

Ausführen : regasmComToPython.dll Registrieren Sie die DLL im System

2. PythonSo rufen Sie COM auf dllKomponente

Ich verwende Python 2.7, PyCharm 2017.1 für IDE, PyCharm neu – Projekt ComToPython, neue Projekt-Py-Datei ComToPython.py

Einstellungen – zwei abhängige Bibliotheken hinzufügen:

Pywin32- und Comtypes-Abhängigkeitsbibliotheken hinzufügen und installieren, um den beiden letztgenannten Arten zum Aufrufen von COM-Komponenten zu entsprechen:

Nachdem die Abhängigkeiten installiert sind, befindet sich im Site-Packages-Verzeichnis des Python-Installationsverzeichnisses ein Doppelklick auf makepy.py

unter C:Python27Libsite-packageswin32comclient. Wählen Sie ComToPython aus und klicken Sie auf OK

然后拷贝上面VS2010生成的COM组件ComToPython.dll至PyCharm ComToPython项目文件夹下:

编写python调用COM dll代码:


#!/usr/bin/env python
# -*- coding: utf-8 -*-
a=1
b=2
print "方法一:"
from win32com.client import Dispatch
dll = Dispatch("ComToPython.Application")
result = dll.Add(a, b)
print "a + b = " + str(result)

print "方法二:"
import comtypes.client
dll = comtypes.client.CreateObject('ComToPython.Application')
result = dll.Add(a, b)
print "a + b = " + str(result)

运行代码,执行结果如下:

以上就是Python调用C# COM Dll整个过程了

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Prozesses zum Aufrufen der C#-Com-DLL-Komponente durch Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn