Question

Je mis en place un serveur com python et générer un exécutable et dll en utilisant l'outil py2exe. puis je regsvr32.exe pour enregistrer le dll.I a reçu un message que l'enregistrement a réussi. Alors j'ai essayé d'ajouter une référence à cette dll dans .NET. J'ai parcouru à l'emplacement dll et sélectionnez, mais je suis une boîte de message d'erreur qui dit: Une référence à la dll n'a pas pu être ajouté, s'il vous plaît assurez-vous que le fichier est accessible et qu'il est un assemblage valide ou COM composant.Procédé code du serveur et la configuration du script est ajouté ci-dessous. Je tiens à mentionner que je peux exécuter le serveur en tant que script python et consommer de .net en utilisant la liaison tardive. Y at-il quelque chose que je manque ou faire du tort? Je vous serais reconnaissant toute aide.

merci, 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"])
Était-ce utile?

La solution 2

Je vais répondre à ma question d'aider chacun peut avoir des questions similaires. J'espère que cela aiderait. Je ne peux pas trouver mon serveur sur l'onglet COM parce que, .NET (et Visual-Studio) ont besoin de serveurs COM avec TLB. Mais les serveurs COM de Python ont pas TLB. Donc, pour utiliser le serveur de .NET par (C # et liaison tardive). Le code suivant montre comment faire ceci:

// le code 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);

        }
    }
}   `

Autres conseils

La ligne:

_reg_clsid_ = pythoncom.CreateGuid()

crée un nouveau GUID à chaque fois que ce fichier est appelé. Vous pouvez créer un GUID sur la ligne de commande:

C:\>python -c "import pythoncom; print pythoncom.CreateGuid()"
{C86B66C2-408E-46EA-845E-71626F94D965}

puis modifiez votre ligne:

_reg_clsid_ = "{C86B66C2-408E-46EA-845E-71626F94D965}"

Après avoir fait ce changement, j'ai pu exécuter votre code et de le tester avec le VBScript suivant:

Set obj = CreateObject("Python.TestServer")   
MsgBox obj.Hello("foo")

Je n'ai pas MSVC à portée de main pour voir si cela résout le problème « ajouter une référence ».

Si vous souhaitez utiliser un organisme enregistré Com objet, vous devez le trouver sur l'onglet Com dans Ajouter Référence boîte de dialogue. Vous ne naviguait pas vers la dll.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top