Pregunta

He implementado un servidor COM pitón y generar un ejecutable y dll usando herramientas py2exe. Luego utiliza Regsvr32.exe para registrar el dll.I recibió un mensaje de que el registro se realizó correctamente. Luego he intentado añadir una referencia a la DLL en .NET. Busqué a la ubicación DLL y seleccionarlo, pero tengo un cuadro de mensaje de error que dice: Una referencia a la DLL no se podría añadir, por favor asegúrese de que el archivo es accesible y que es un ensamblado válido o COM component.The se añade el código del script del servidor y la configuración a continuación. Quiero mencionar que puedo ejecutar el servidor como un script en Python y lo consumen de .NET utilizando el enlace en tiempo. ¿Hay algo que me falta o hacer mal? Le agradecería cualquier ayuda.

gracias, Sarah

hello.py

import pythoncom

import sys

class HelloWorld:

    #pythoncom.frozen = 1
    if hasattr(sys, 'importers'):
        _reg_class_spec_ = "__main__.HelloWorld" 
    _reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER
    _reg_clsid_ = pythoncom.CreateGuid()
    _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
        print "Hello" + " " * self.softspace + str(who)
        return "Hello" + " " * self.softspace + str(who)


if __name__=='__main__':
    import sys
    if hasattr(sys, 'importers'):

        # running as packed executable.

        if '--register' in sys.argv[1:] or '--unregister' in sys.argv[1:]:

            # --register and --unregister work as usual
            import win32com.server.register
            win32com.server.register.UseCommandLine(HelloWorld)
        else:

            # start the server.
            from win32com.server import localserver
            localserver.main()
    else:

        import win32com.server.register
        win32com.server.register.UseCommandLine(HelloWorld) 

setup.py

from distutils.core import setup
import py2exe

setup(com_server = ["hello"])
¿Fue útil?

Solución 2

Voy a responder a mi pregunta para ayudar a cualquiera puede tener preguntas similares. Espero que eso ayudaría. No puedo encontrar mi servidor en la ficha COM, ya que, .NET (y Visual-Studio) necesita servidores COM con TLB. Pero servidores COM de Python no tienen TLB. Así que para utilizar el servidor de .NET (C # y la ligadura). El código siguiente muestra cómo hacer esto:

// el código C #

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);

        }
    }
}   `

Otros consejos

La línea:

_reg_clsid_ = pythoncom.CreateGuid()

crea un nuevo GUID cada vez que este archivo se llama. Puede crear un GUID en la línea de comandos:

C:\>python -c "import pythoncom; print pythoncom.CreateGuid()"
{C86B66C2-408E-46EA-845E-71626F94D965}

y luego cambiar su línea:

_reg_clsid_ = "{C86B66C2-408E-46EA-845E-71626F94D965}"

Después de hacer este cambio, yo era capaz de ejecutar su código y probarlo con el VBScript siguiente:

Set obj = CreateObject("Python.TestServer")   
MsgBox obj.Hello("foo")

No tengo MSVC a mano para ver si esto soluciona el problema "Add Reference".

Si desea utilizar una marca registrada es objeto, es necesario encontrar en la pestaña Com en el Agregar referencia cuadro de diálogo . No navegar a la DLL.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top