2011-02-23 40 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