2011-02-23 39 views
1

我目前正在使用託管代碼中的COM對象,並使用新的動態類型。這在一些領域運作良好,但可能成爲其他領域的問題。在C中包裝COM對象/動態類型#

我想,我怎麼能得到兩全其美的,動態型(後期綁定)與支持的靈活性,比方說,一個RCW(早期綁定)

不知怎的,包裹在動態類型一個更易於管理的結構。我想知道是否有一個首選的方法(如果它甚至是一個好主意)或我應該考慮的事情。

兩個基本觀點我想出迄今如下:

首先,創建一個靜態類,允許我這樣稱呼的動態類型的方法,在管理方式。

public static class ComObjectWrapper 
{ 
    public static void SomeMethod(dynamic comObject, int x) 
    { 
     comObject.someMethod(x); 
    } 

    public static bool GetSomeProp(dynamic comObject) 
    { 
     comObject.getSomeProp(); 
    } 

    public static void SetSomeProp(dynamic comObject, bool foo) 
    { 
     comObject.setSomeProp(foo); 
    } 
} 

其次,創建使用COM對象,那麼它的所有成員映射到託管屬性,方法構造一類等

public class ComObjectWrapper 
{ 
    private dynamic comObject = null; 

    public ComObjectWrapper(dynamic comObject) 
    { 
    this.comObject = comObject; 
    } 

    public void SomeMethod(int x) 
    { 
     comObject.someMethod(x); 
    } 

    public bool SomeProp 
    { 
     get 
     { 
     return comObject.getSomeProp(); 
     } 
     set 
     { 
     comObject.setSomeProp(value); 
     } 
    } 
} 

還有沒有其他的方法可以解決這個?我錯過了一些愚蠢的東西!?

+0

如果你有選擇所有使用* dynamic *的RCW都沒有意義。幾乎所有的COM服務器都支持它,導入類型庫。 – 2011-02-23 20:33:18

+0

對不起,我完全不同意 - 例如;如果不在我的控制範圍內的類型庫被更新,那麼基於它的RCW的任何應用程序都會中斷。其次,所有類型庫的版本呢,我只能針對一個版本。本質上,我想遲遲綁定,以避免版本依賴於我無法控制的庫。 – Fraser 2011-02-23 21:18:46

回答

2

開源框架Impromptu-Interface將使用靜態接口包裝一個動態對象,使得來自接口的所有靜態定義的成員使用dlr轉發給動態對象。

創建你的界面

IComObjectWrapper 
{ 
    void SomeMethod(int x); 
    bool SomeProp; 
} 

然後,你需要換你的COM對象包括ImpromptuInterface

using ImpromptuInterface; 

最後把它包起來:

var tStaticTyped = Impromptu.ActLike<IComObjectWrapper>(comObject); 
+0

這聽起來很有趣 - 我現在就去試試吧! – Fraser 2011-02-28 16:37:52