mit registrierten COM-Objekt DLL-Datei von .NET
Frage
ich einen Python-com-Server implementiert und erzeugen py2exe Tool eine ausführbare Datei und DLL verwenden. dann habe ich regsvr32.exe die dll.I bekam eine Nachricht zu registrieren, dass die Registrierung erfolgreich war. Dann habe ich versucht Verweis auf diese DLL in .NET hinzuzufügen. Ich an die dll Lage geblättert und wählen Sie es, aber ich habe eine Fehlermeldung Feld, das sagt: Ein Verweis auf die DLL konnte nicht hinzugefügt werden, vergewissern Sie sich, dass die Datei zugänglich ist und dass es sich um eine gültige Assembly oder COM-Komponente Code des Servers und Setup-Skript wird im folgenden gegeben. Ich möchte erwähnen, dass ich den Server als Python-Skript ausgeführt werden kann und verbrauchen sie von .net späte Bindung verwenden. Gibt es etwas, was ich bin fehlt oder falsch? Ich würde jede Hilfe dankbar.
Danke, 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"])
Lösung 2
werde ich meine Frage beantworten, irgend jemanden zu helfen, können ähnliche Fragen haben. Ich hoffe, das helfen würde. Ich kann nicht meinen Server auf der Registerkarte COM finden, weil .NET (& Visuell-Studio) benötigt COM-Server mit TLB. Aber Pythons COM-Server hat keinen TLB. So verwenden Sie den Server von .NET von (C # und später Bindung). Der folgende Code zeigt, wie dies zu machen:
// die 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);
}
}
} `
Andere Tipps
Die Zeile:
_reg_clsid_ = pythoncom.CreateGuid()
erstellt eine neue GUID jedes Mal diese Datei aufgerufen wird. Sie können eine GUID in der Befehlszeile erstellen:
C:\>python -c "import pythoncom; print pythoncom.CreateGuid()"
{C86B66C2-408E-46EA-845E-71626F94D965}
und dann Zeile:
_reg_clsid_ = "{C86B66C2-408E-46EA-845E-71626F94D965}"
Mit dieser Änderung Nachdem konnte ich Ihren Code ausführen und testen Sie es mit dem folgenden VBScript:
Set obj = CreateObject("Python.TestServer")
MsgBox obj.Hello("foo")
Ich habe nicht MSVC handlich zu sehen, ob das "add reference" behebt Problem.
Wenn Sie verwenden möchten, eine eingetragene Com Objekt, müssen Sie es auf der Registerkarte COM in der Verweis hinzufügen Dialogfeld. Sie navigieren nicht auf die dll.