当前位置: 首页 > 面试题库 >

从.NET消耗Python COM Server

乐正翰
2023-03-14
问题内容

我想使用win32com扩展来实现python
com服务器。然后从.NET内部使用服务器。我使用以下示例来实现com服务器,并且该服务器可以正常运行,但是当我尝试使用C#对其进行使用时,出现了FileNotFoundException并显示以下消息“为具有CLSID
{676E38A6-7FA7-4BFF-9179的组件检索COM类工厂” -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);

        }
    }
}

问题答案:

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

因此,应该是这样(通常,这是未经测试的代码!):

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-注册
HelloWorldCOM.py

类HelloWorld是服务器的实际实现。它公开了一个方法(Hello)和几个属性,这两个属性之一是只读的。使用第一个命令,注册服务器;在第二个应用程序中,您可以运行它,然后其他应用程序可以使用它。



 类似资料:
  • 我们使用的是Spring kafka 2.7非阻塞重试机制。在Spring Kafka重试机制中,Kafka listenser使用来自main topic、Retry topic和DLT topic的消息,我们希望侦听器仅使用来自main和Retry topic的消息。 有没有简单的方法来进行设置? 因为我们不希望同一个消费者处理DLT消息。DLT还将被另一个进程使用,以发送请求通知。

  • 我有一个Java pc应用程序,一旦加载相应的配置数据,CPU性能就会逐步提高。 基本有2个线程,一个主线程,一个副线程。在主线程中生成一个登录和一个数据加载,而在第二个线程中每10秒生成一次查询。如果会话启动但未加载数据,则第二个线程继续查询但性能最小。CPU消耗的增加是在加载数据后产生的,并且逐渐增加。 此外,如果再次加载数据,则消耗将降至最低,一旦加载,消耗将再次增加。 由于保密问题,我不能

  • 游戏进行外消耗道具 用法:传入需要消耗的道具列表已经对应的数量,则可以使用道具 消耗成功后,后台回吐消耗成功、失败的道具列表。如果消耗成功,则顺带返回一个流水号seq,用于标识此次消耗,此序列号可以用来进行回滚操作 var itemlist = [ { "id":1, //道具id "num":1, //数量 },

  • 我有一个在Payara 4.1.2.173上运行的应用程序。应用程序应该发送和接收JMS消息,因此,我使用Apache ActiveMQ Artemis。我选择ActiveMQ Artemis是因为ActiveMQ只支持JMS1.1,而ActiveMQ Artemis支持JMS2.0。 但是我觉得奇怪的是,ActiveMQ Artemis没有提供资源适配器(.rar文件),而ActiveMQ却提供

  • 我有一个服务员线程想使用RabbitMQ direct exchange向Java中的客户线程发送一道寿司,但是我的客户没有收到这道菜。下面是我的服务员用来发布寿司菜肴对象的方法: 请注意,<code>dishKey</code>作为参数传递,并在之前的if-else语句中被确定为<code>的“tamagoDishKey”</code>或<code>“ebiDishKey”的 以下是我的客户用来

  • 问题内容: 我需要监视应用程序产生的线程消耗的内存量。如果贪婪的线程消耗太多内存,则想法是采取纠正措施。我已提到Java线程占用多少内存?。关于该链接的建议之一是在我尝试以下工作时使用。 我在四个线程上运行了很长时间。尽管作业不会连续地累积内存,但是所返回的值会不断增加,甚至不会下降。这意味着不会返回线程使用的堆上的实际内存量。它返回自线程启动以来在堆上为线程分配的内存总量。我的平台详细信息如下: