2009-06-28 77 views
5

我想用win32com擴展實現python com服務器。 然後從.NET內部使用服務器。 我用下面的例子來實現COM服務器,它運行沒有問題,但是當我嘗試使用使用C#是我FileNotFoundException異常以下消息「檢索COM類工廠CLSID 676E38A6-7FA7-4BFF-組件{ 9179-AE959734DEBB}由於以下錯誤而失敗:8007007e。「 。我也發佈了C#代碼。我想知道如果我錯過了什麼,我會很感激任何幫助。.NET中使用Python COM服務器

感謝, 薩拉

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

     } 
    } 
} 
+1

注意python代碼中的警告,不要在每次調用時使用新的GUID。只創建一次GUID。 – gimel 2009-06-28 12:53:11

+0

您發佈的代碼用於註冊COM服務器;你是否也實現(並運行)了實際的服務器? – 2009-06-28 13:26:16

回答

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)和一些屬性,其中一種是隻讀的。 使用第一條命令,註冊服務器;與第二個,你運行它,然後它變得可用於其他應用程序的使用。

0

您需要在C#可執行文件運行Process Monitor追查未找到該文件。