en utilisant dll enregistré objet COM à partir de .NET
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"])
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.