在C#中包装COM对象/动态类型

时间:2011-02-23 20:04:46

标签: c# design-patterns com dynamic c#-4.0

我目前正在使用托管代码中的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);
      }
   }
}

还有其他方法可以解决这个问题吗?我错过了一些愚蠢的东西!?

1 个答案:

答案 0 :(得分:2)

开源框架Impromptu-Interface将使用静态接口包装动态对象,以便接口中所有静态定义的成员使用dlr转发到动态对象。

创建您的界面

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

然后你需要包装你的com对象包括ImpromptuInterface

  using ImpromptuInterface;

最后把它包起来:

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