utilizzando oggetto COM registrato dll da .NET
Domanda
ho implementato un server COM pitone e generare un eseguibile e DLL utilizzando lo strumento py2exe. poi ho usato regsvr32.exe per registrare il dll.I ricevuto un messaggio che la registrazione ha avuto successo. Poi ho provato ad aggiungere riferimento a tale dll in .NET. Ho passato in rassegna alla posizione dll e selezionarlo, ma ho ottenuto una finestra di messaggio di errore che dice: un riferimento alla DLL non poteva essere aggiunta, assicurarsi che il file sia accessibile e che si tratta di un assembly valido o COM component.The viene aggiunto sotto il codice dello script del server e la configurazione. Voglio menzionare che posso eseguire il server come uno script python e consumarlo da .NET utilizzando l'associazione tardiva. C'è qualcosa che mi manca o facendo male? Gradirei qualsiasi aiuto.
Grazie, 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"])
Soluzione 2
io rispondere alla mia domanda per aiutare qualcuno può avere domande simili. Spero che avrebbe aiutato. Non riesco a trovare il mio server nella scheda COM perché, NET (e visivo-Studio) ha bisogno di server COM con TLB. Ma server COM di Python non hanno TLB. Quindi, per utilizzare il server dal .NET (C # e vincolante in ritardo). Il codice seguente mostra come fare questo:
// il codice 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);
}
}
} `
Altri suggerimenti
La linea:
_reg_clsid_ = pythoncom.CreateGuid()
crea un nuovo GUID ogni volta che questo file è denominato. È possibile creare un GUID nella riga di comando:
C:\>python -c "import pythoncom; print pythoncom.CreateGuid()"
{C86B66C2-408E-46EA-845E-71626F94D965}
e quindi modificare la riga:
_reg_clsid_ = "{C86B66C2-408E-46EA-845E-71626F94D965}"
Dopo aver fatto questo cambiamento, sono stato in grado di eseguire il codice e testarlo con il seguente VBScript:
Set obj = CreateObject("Python.TestServer")
MsgBox obj.Hello("foo")
Non ho MSVC a portata di mano per vedere se questo risolve il problema "aggiungi riferimento".
Se si desidera utilizzare un registrati Com oggetto, è necessario trovare sulla scheda COM nella Aggiungi riferimento finestra di dialogo. Non navigare alla DLL.