我实现了一个python com服务器并使用py2exe工具生成可执行文件和dll。 然后我使用regsvr32.exe注册dll。我收到一条消息,注册成功。然后我尝试在.NET中添加对该dll的引用。我浏览到dll位置并选择它,但是我收到一个错误消息框,说明:无法添加对dll的引用,请确保该文件是可访问的,并且它是有效的程序集或COM组件。下面添加了服务器和安装脚本的代码。 我想提一下,我可以将服务器作为python脚本运行,并使用后期绑定从.net中使用它。 有什么我错过或做错了吗?我将不胜感激任何帮助。
感谢, 萨拉
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)
from distutils.core import setup
import py2exe
setup(com_server = ["hello"])
答案 0 :(得分:2)
该行:
_reg_clsid_ = pythoncom.CreateGuid()
每次调用此文件时,都会创建一个新的GUID。您可以在命令行上创建GUID:
C:\>python -c "import pythoncom; print pythoncom.CreateGuid()"
{C86B66C2-408E-46EA-845E-71626F94D965}
然后改变你的行:
_reg_clsid_ = "{C86B66C2-408E-46EA-845E-71626F94D965}"
进行此更改后,我能够运行您的代码并使用以下VBScript进行测试:
Set obj = CreateObject("Python.TestServer")
MsgBox obj.Hello("foo")
我没有MSVC方便看看这是否修复了“添加引用”问题。
答案 1 :(得分:2)
我会回答我的问题,以帮助任何人提出类似的问题。我希望这会有所帮助。 我在COM选项卡上找不到我的服务器,因为.NET(& Visual-Studio)需要带有TLB的COM服务器。但是Python的COM服务器没有TLB。 所以要使用.NET中的服务器(C#和Late binding)。以下代码显示了如何执行此操作:
// 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);
}
}
} `
答案 2 :(得分:0)
如果要使用已注册的 Com 对象,则需要在Add Reference对话框的Com选项卡上找到它。您没有导航到dll。