using registered com object dll from .NET
我实现了一个 python com 服务器并使用 py2exe 工具生成了一个可执行文件和 dll。
然后我用regsvr32.exe注册了dll。我收到了注册成功的消息。然后我尝试在 .NET 中添加对该 dll 的引用。我浏览到 dll 位置并选择它,但我收到一个错误消息框,上面写着:无法添加对 dll 的引用,请确保该文件可访问并且它是有效的程序集或 COM 组件。服务器和设置脚本的代码添加在下面。
我想提一下,我可以将服务器作为 python 脚本运行,并使用后期绑定从 .net 使用它。
我有什么遗漏或做错了吗?我将不胜感激。
谢谢,
莎拉
你好.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | 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) |
安装程序.py
1 2 3 4 | from distutils.core import setup import py2exe setup(com_server = ["hello"]) |
我会回答我的问题以帮助任何可能有类似问题的人。我希望这会有所帮助。
我在 COM 选项卡上找不到我的服务器,因为 .NET (
线路:
1 | _reg_clsid_ = pythoncom.CreateGuid() |
每次调用此文件时都会创建一个新的 GUID。您可以在命令行上创建 GUID:
1 2 | C:\\>python -c"import pythoncom; print pythoncom.CreateGuid()" {C86B66C2-408E-46EA-845E-71626F94D965} |
然后换行:
1 | _reg_clsid_ ="{C86B66C2-408E-46EA-845E-71626F94D965}" |
进行此更改后,我能够运行您的代码并使用以下 VBScript 对其进行测试:
1 2 | Set obj = CreateObject("Python.TestServer") MsgBox obj.Hello("foo") |
我没有方便的 MSVC 来查看这是否解决了"添加引用"问题。
如果你想使用一个注册的 Com 对象,你需要在 Add Reference 对话框的 Com 选项卡上找到它。您没有导航到 dll。