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"])
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top