Pergunta

Eu implementou um servidor com python e gerar um executável e DLL utilizando a ferramenta py2exe. então eu usei regsvr32.exe para registrar o dll.I recebi uma mensagem que o registo foi bem sucedido. Então eu tentei adicionar referência a essa dll em .NET. Eu naveguei para o local dll e selecioná-lo, mas eu tenho uma caixa de mensagem de erro que diz: Uma referência ao dll não pôde ser adicionado, por favor, certifique-se de que o arquivo está acessível e que é um assembly válido ou COM componente importante.A código do script de servidor e configuração é adicionada abaixo. Quero mencionar que eu possa executar o servidor como um script python e consumi-lo de .net usando a ligação tardia. Existe algo que eu estou ausente ou fazendo de errado? Gostaria muito de receber qualquer ajuda.

graças, 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"])
Foi útil?

Solução 2

Vou responder a minha pergunta para ajudar qualquer um pode ter dúvidas semelhantes. Espero que iria ajudar. Não consigo encontrar meu servidor na guia COM porque, .NET (e-Studio Visual) servidores necessidade COM com TLB. Mas servidores COM do Python não têm TLB. Então, para usar o servidor de .NET (C # e ligação tardia). Os seguintes mostra o código como fazer isso:

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

        }
    }
}   `

Outras dicas

A linha:

_reg_clsid_ = pythoncom.CreateGuid()

cria um novo cada vez que GUID esse arquivo é chamado. Você pode criar um GUID na linha de comando:

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

e, em seguida, alterar a linha:

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

Depois de fazer essa alteração, eu era capaz de executar o seu código e testá-lo com o seguinte VBScript:

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

Eu não tenho MSVC útil para ver se isso resolve o problema "Adicionar referência".

Se você quiser usar um registrado Com objeto, você precisa encontrá-lo no separador Com na caixa de diálogo Adicionar Referência . Você não navegar para a dll.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top