从.NET消费Python的COM服务器(Consuming Python COM Server f

2019-06-24 08:29发布

我想用win32com扩展来实现的Python COM服务器。 然后,从.NET中消耗服务器。 我用下面的例子来实现COM服务器,它运行没有问题,但是当我尝试使用它使用C#我得到FileNotFoundException异常以下消息“检索COM类工厂组件具有CLSID {676E38A6-7FA7-4BFF-9179 -AE959734DEBB}失败,原因是以下错误:8007007E“。 。 我张贴的C#代码well.I不知道如果我想的东西我希望得到任何帮助。

谢谢,萨拉

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

        }
    }
}

Answer 1:

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类是实际执行的服务器。 它暴露一个方法(你好)和一对夫妇的属性,一个两个是只读的。 随着第一个命令,你注册服务器; 与第二个,你运行它,然后将其变成可从其他应用程序的使用。



Answer 2:

您需要在产品运行过程监控你的C#可执行文件,以追查未找到该文件。



文章来源: Consuming Python COM Server from .NET
标签: .net python com