Consumiendo Python COM Server desde .NET

Quería implementar el servidor com de Python usando las extensiones win32com. Luego consum el servidor desde dentro de .NET. Utilicé el siguiente ejemplo para implementar el servidor com y se ejecuta sin problemas, pero cuando bash consumirlo usando C # obtuve la excepción FileNotFoundException con el siguiente mensaje “Recuperando la fábrica de clases COM para el componente con CLSID {676E38A6-7FA7-4BFF-9179 -AE959734DEBB} falló debido al siguiente error: 8007007e “. . También publiqué el código C #. Me pregunto si me falta algo que agradecería cualquier ayuda.

Gracias Sarah

#PythonCOMServer.py import pythoncom class PythonUtilities: _public_methods_ = [ 'SplitString' ] _reg_progid_ = "PythonDemos.Utilities" # NEVER copy the following ID # Use"print pythoncom.CreateGuid()" to make a new one. _reg_clsid_ = pythoncom.CreateGuid() print _reg_clsid_ def SplitString(self, val, item=None): import string if item != None: item = str(item) return string.split(str(val), item) # Add code so that when this script is run by # Python.exe,.it self-registers. if __name__=='__main__': print 'Registering Com Server' import win32com.server.register win32com.server.register.UseCommandLine(PythonUtilities) // the C# code using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { Type pythonServer; object pythonObject; pythonServer = Type.GetTypeFromProgID("PythonDemos.Utilities"); pythonObject = Activator.CreateInstance(pythonServer); } } } 

Un servidor COM es solo una pieza de software (una DLL o un ejecutable) que aceptará llamadas a procedimientos remotos (RPC) a través de un protocolo definido. Parte del protocolo dice que el servidor debe tener una ID única, almacenada en el registro de Windows. En nuestro caso, esto significa que usted ha “registrado” un servidor que no existe. Por lo tanto el error (componente no encontrado).

Entonces, debería ser algo como esto (como es habitual, ¡este es un código no probado!):

 import pythoncom class HelloWorld: _reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER _reg_clsid_ = "{B83DD222-7750-413D-A9AD-01B37021B24B}" _reg_desc_ = "Python Test COM Server" _reg_progid_ = "Python.TestServer" _public_methods_ = ['Hello'] _public_attrs_ = ['softspace', 'noCalls'] _readonly_attrs_ = ['noCalls'] def __init__(self): self.softspace = 1 self.noCalls = 0 def Hello(self, who): self.noCalls = self.noCalls + 1 # insert "softspace" number of spaces return "Hello" + " " * self.softspace + str(who) if __name__ == '__main__': if '--register' in sys.argv[1:] or '--unregister' in sys.argv[1:]: import win32com.server.register win32com.server.register.UseCommandLine(HelloWorld) else: # start the server. from win32com.server import localserver localserver.serve('B83DD222-7750-413D-A9AD-01B37021B24B') 

Luego debe ejecutar desde la línea de comandos (asumiendo que el script se llama HelloWorldCOM.py):

  HelloWorldCOM.py --register
 HelloWorldCOM.py 

La clase HelloWorld es la implementación real del servidor. Expone un método (Hello) y un par de atributos, uno de los dos es de solo lectura. Con el primer comando, se registra el servidor; con el segundo, lo ejecutas y luego queda disponible para su uso desde otras aplicaciones.

Necesita ejecutar Process Monitor en su C # ejecutable para rastrear el archivo que no se encuentra.