当前位置:  开发笔记 > 编程语言 > 正文

从.NET使用Python COM服务器

如何解决《从.NET使用PythonCOM服务器》经验,为你挑选了1个好方法。

我想使用win32com扩展来实现python com服务器.然后从.NET中使用服务器.我使用以下示例来实现com服务器并且它运行没有问题但是当我尝试使用C#消耗它时,我得到了FileNotFoundException并带有以下消息"使用CLSID检索组件的COM类工厂{676E38A6-7FA7-4BFF-9179 -AE959734DEBB}由于以下错误而失败:8007007e." .我也发布了C#代码.我想知道我是否遗漏了一些我会感激任何帮助.

谢谢,莎拉

#PythonCOMServer.py

import pythoncom
class PythonUtilities:
    _public_methods_ = [ 'SplitString' ]
    _reg_progid_ = "PythonDemos.Utilities"
    # NEVER copy the following ID

    # Use"print pythoncom.CreateGuid()" to make a new one.
    _reg_clsid_ = pythoncom.CreateGuid()
    print _reg_clsid_
    def SplitString(self, val, item=None):
        import string
        if item != None: item = str(item)
        return string.split(str(val), item)

# Add code so that when this script is run by
# Python.exe,.it self-registers.

if __name__=='__main__':        
    print 'Registering Com Server'
    import win32com.server.register
    win32com.server.register.UseCommandLine(PythonUtilities)


// the C# code
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);

        }
    }
}

rob.. 10

COM服务器只是一个软件(DLL或可执行文件),它将通过定义的协议接受远程过程调用(RPC).协议的一部分说服务器必须具有唯一的ID,存储在Windows的注册表中.在我们的例子中,这意味着您已"注册"了不存在的服务器.因此错误(未找到组件).

所以,它应该是这样的(像往常一样,这是未经测试的代码!):

import pythoncom

class HelloWorld:
    _reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER
    _reg_clsid_ = "{B83DD222-7750-413D-A9AD-01B37021B24B}"
    _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
        return "Hello" + " " * self.softspace + str(who)

if __name__ == '__main__':
    if '--register' in sys.argv[1:]  or '--unregister' in sys.argv[1:]:
        import win32com.server.register
        win32com.server.register.UseCommandLine(HelloWorld)
    else:
        # start the server.
        from win32com.server import localserver
        localserver.serve('B83DD222-7750-413D-A9AD-01B37021B24B')

然后你应该从命令行运行(假设脚本名为HelloWorldCOM.py):

HelloWorldCOM.py --register
HelloWorldCOM.py

HelloWorld类是服务器的实际实现.它暴露了一个方法(Hello)和一些属性,其中一个是只读的.使用第一个命令,注册服务器; 使用第二个,运行它然后它可以从其他应用程序使用.



1> rob..:

COM服务器只是一个软件(DLL或可执行文件),它将通过定义的协议接受远程过程调用(RPC).协议的一部分说服务器必须具有唯一的ID,存储在Windows的注册表中.在我们的例子中,这意味着您已"注册"了不存在的服务器.因此错误(未找到组件).

所以,它应该是这样的(像往常一样,这是未经测试的代码!):

import pythoncom

class HelloWorld:
    _reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER
    _reg_clsid_ = "{B83DD222-7750-413D-A9AD-01B37021B24B}"
    _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
        return "Hello" + " " * self.softspace + str(who)

if __name__ == '__main__':
    if '--register' in sys.argv[1:]  or '--unregister' in sys.argv[1:]:
        import win32com.server.register
        win32com.server.register.UseCommandLine(HelloWorld)
    else:
        # start the server.
        from win32com.server import localserver
        localserver.serve('B83DD222-7750-413D-A9AD-01B37021B24B')

然后你应该从命令行运行(假设脚本名为HelloWorldCOM.py):

HelloWorldCOM.py --register
HelloWorldCOM.py

HelloWorld类是服务器的实际实现.它暴露了一个方法(Hello)和一些属性,其中一个是只读的.使用第一个命令,注册服务器; 使用第二个,运行它然后它可以从其他应用程序使用.


`localserver.serve('B83DD222-7750-413D-A9AD-01B37021B24B')`几乎是正确的.你需要包括大括号并将它放在一个列表中:`localserver.serve(['{B83DD222-7750-413D-A9AD-01B37021B24B}'])`.否则完美无瑕.
推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有