我实现一个Python COM服务器并使用py2exe工具生成可执行和DLL。 然后我用Regsvr32.exe注册的dll.I收到了消息的注册是成功的。然后我试图在.NET中添加引用该DLL。我浏览到该dll位置并选择它,但我得到一个错误消息框,指出:对DLL的引用无法添加,请确保该文件是可访问的,并且它是一个有效的程序集或COM component.The服务器和安装脚本的代码如下补充。 我想提一提,我可以运行服务器作为一个python脚本,并从.NET中使用后期绑定使用它。 是否有什么我失踪或者做错了什么?我希望得到任何帮助。

感谢, 萨拉

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"])
有帮助吗?

解决方案 2

我会回答我的问题,以帮助任何一个可能有类似的问题。我希望这将有助于。 因为,.NET(视觉工作室)需要TLB COM服务器我无法找到我的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);

        }
    }
}   `

其他提示

行:

_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方便,看是否能解决“添加引用”的问题。

如果你想使用注册的使用COM 的对象,你需要找到它的的添加引用对话框。你不导航到该dll。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top