2

我实现了一个 python com 服务器并使用 py2exe 工具生成了一个可执行文件和 dll。然后我用regsvr32.exe注册了dll。我收到了注册成功的消息。然后我尝试在 .NET 中添加对该 dll 的引用。我浏览到 dll 位置并选择它,但我收到一个错误消息框,上面写着:无法添加对 dll 的引用,请确保该文件可访问并且它是有效的程序集或 COM 组件。服务器和设置脚本的代码添加在下面。我想提一下,我可以将服务器作为 python 脚本运行,并使用后期绑定从 .net 使用它。我有什么遗漏或做错了吗?我将不胜感激任何帮助。

谢谢,莎拉

你好.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) 

安装程序.py

from distutils.core import setup
import py2exe

setup(com_server = ["hello"])
4

3 回答 3

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 来查看这是否解决了“添加引用”问题。

于 2009-07-05T21:45:35.733 回答
2

我将回答我的问题以帮助任何可能有类似问题的人。我希望这会有所帮助。我在 COM 选项卡上找不到我的服务器,因为 .NET(和 Visual-Studio)需要带有 TLB 的 COM 服务器。但是 Python 的 COM 服务器没有 TLB。因此,通过(C# 和后期绑定)使用 .NET 中的服务器。以下代码显示了如何做到这一点:

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

        }
    }
}   `
于 2009-07-20T07:25:19.850 回答
0

如果要使用已注册的Com对象,则需要在Add Reference对话框的 Com 选项卡上找到它。您不导航到 dll。

于 2009-07-05T12:38:44.297 回答