【问题标题】:Wrapping a COM object/dynamic type in C#在 C# 中包装 COM 对象/动态类型
【发布时间】:2011-03-01 00:09:42
【问题描述】:

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

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

【问题讨论】:

  • 如果您完全可以选择 RCW,那么使用 dynamic 就没有意义了。几乎所有的 COM 服务器都支持它,请导入类型库。
  • 对不起,我完全不同意——例如;如果我无法控制的类型库被更新,那么任何基于其 RCW 的应用程序都会被破坏。其次,类型库的所有版本呢,我只能针对一个版本。本质上,我想后期绑定以避免版本依赖于我无法控制的库。

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


【解决方案1】:

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

创建你的界面

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

那么你需要包装你的 com 对象的地方包括 ImpromptuInterface

  using ImpromptuInterface;

最后包装一下:

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

【讨论】:

  • 这听起来很有趣 - 我现在就试一试!
猜你喜欢
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 2019-10-30
  • 2011-06-29
  • 2019-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多