我目前正在使用托管代码中的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 :(得分:2)
开源框架Impromptu-Interface将使用静态接口包装动态对象,以便接口中所有静态定义的成员使用dlr转发到动态对象。
创建您的界面
IComObjectWrapper
{
void SomeMethod(int x);
bool SomeProp;
}
然后你需要包装你的com对象包括ImpromptuInterface
using ImpromptuInterface;
最后把它包起来:
var tStaticTyped = Impromptu.ActLike<IComObjectWrapper>(comObject);