usando registrado objeto COM DLL do .NET
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"])
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.