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

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

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


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

创建你的界面

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

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

  using ImpromptuInterface;

最后要包装它:

var tStaticTyped = Impromptu.ActLike<IComObjectWrapper>(comObject);
链接地址: http://www.djcxy.com/p/31891.html

上一篇: Wrapping a COM object/dynamic type in C#

下一篇: Dynamically access object property using variable