2009-07-05 10 views
2

Ich implementierte einen Python-com-Server und generieren eine ausführbare Datei und DLL mit py2exe-Tool. Dann habe ich Regsvr32.exe verwendet, um die DLL zu registrieren. Ich habe eine Nachricht erhalten, dass die Registrierung erfolgreich war. Dann habe ich versucht, einen Verweis auf diese DLL in .NET hinzuzufügen. Ich habe den Speicherort der DLL durchsucht und es ausgewählt, aber ich habe ein Fehlermeldungsfeld mit der Meldung: Ein Verweis auf die DLL konnte nicht hinzugefügt werden, stellen Sie sicher, dass die Datei zugänglich ist und dass es eine gültige Assembly oder COM-Komponente ist Code des Servers und Setup-Skript wird unten hinzugefügt. Ich möchte erwähnen, dass ich den Server als ein Python-Skript ausführen und es von .net mit späte Bindung verwenden kann. Gibt es etwas, das ich vermisse oder falsch mache? Ich würde jede Hilfe schätzen.mit registrierten com-Objekt dll von .NET

Dank, 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"]) 

Antwort

2

Ich werde meine Frage beantworten, um jemandem zu helfen, ähnliche Fragen zu haben. Ich hoffe, das würde helfen. Ich kann meinen Server nicht auf der Registerkarte COM finden, da .NET (& Visual-Studio) COM-Server mit TLB benötigt. Aber Pythons COM-Server haben keinen TLB. Also um den Server von .NET zu nutzen (C# und Late Binding). 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); 

     } 
    } 
} ` 
0

Wenn Sie eine registrierte Com Objekt verwenden möchten, müssen Sie es auf finden die Registerkarte Com im Dialogfeld Add Reference. Sie navigieren nicht zur DLL.

+0

Dank für die Beantwortung, ich habe das auf dem ersten, aber nicht meinen Server in der Registerkarte COM finden, also dachte ich, ich würde navigieren zu ihm. – Sarah

2

Die Linie:

_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}" 

Nach dieser Änderung konnte ich Ihren Code ausführen und testen Sie es mit dem folgenden VBScript:

Ich habe MSVC nicht zur Hand, um zu sehen, ob dies das Problem "Referenz hinzufügen" behebt.

+0

Danke für Ihre Antwort, ich folgte Ihren Anleitungen Ich registrierte den Server ohne Probleme. Aber ich kann meinen Server immer noch nicht auf COM Tab finden. – Sarah

+0

Ich denke, Sie müssen eine Typbibliothek schreiben und registrieren, wenn der COM-Server auf dieser Registerkarte angezeigt werden soll. Ich weiß nicht, ob Pythoncom einen erzeugen kann, aber Sie können dies tun, indem Sie eine IDL für Ihren Server schreiben und diese mit MIDL kompilieren. – ars

+0

Übrigens, wenn Sie Ihre Antwort hier nicht finden, versuchen Sie die Python-win32-Liste: http://mail.python.org/mailman/listinfo/python-win32 Das ist ein guter Ort, um Antworten zu erhalten auf Python/Win-Zeug. – ars