【问题标题】:Casting generic COM object to a specific .NET class将通用 COM 对象转换为特定的 .NET 类
【发布时间】:2013-10-14 03:49:47
【问题描述】:

我不是 C# 程序员,如果这是一个愚蠢的问题,请原谅,但我找不到任何解决方案。

我有一个Object。它是一个 COM 对象,它的 ToString() 返回“System.__comObject”。当用调试器检查它的内部内容时,我可以看到这个对象有一个名为Object 的属性,它是我想要的实际类的一个实例。但是,Object 类没有属性Object,当我尝试将对象本身转换为所需类型时,我得到一个异常。 COM对象应该如何转换为.NET对象?

【问题讨论】:

  • 你不能,你能做的最好的就是将它转换为与对象实现的 COM 接口之一匹配的接口
  • @Mgetz:我怎样才能找到它实现了哪些接口?
  • 您的问题似乎表明您可以访问本机代码,如果是这种情况,您可以查看对象本机声明。但如果可以的话,我强烈建议您使用Tlbimp to create a .NET library to do the interop for you.
  • @Mgetz:不,它是 Microsoft 库,而且文档记录很差。我当然没有这个对象的声明。事实上,我只能猜测它的类型,这正是我想要做的。
  • 哪个库?它可能已经有一个主互操作程序集。

标签: c# com casting type-conversion


【解决方案1】:

如果你知道你想要它是什么类型,你可以设置一个方法来自己转换它,使用dynamic来访问属性:

public static MyObject ConvertFromComObject(dynamic comObject)
{
    return comObject.Object;
}
// or, if that doesn't work:
public static MyObject ConvertFromComObject(dynamic comObject)
{
    return new MyObject { MyProperty = comObject.Object.MyProperty };
}
// or maybe
public static MyObject ConvertFromComObject(dynamic comObject)
{
    return new MyObject { MyProperty = comObject.MyProperty };
}

【讨论】:

  • 这行得通,非常感谢!我可以让它在没有独立方法的情况下在线工作吗?
  • @VioletGiraffe 当然可以。只需投射到dynamic,例如MyObject myObj = ((dynamic)comObject).Object;,或从一开始就将您的comObject 声明为dynamicdynamic comObject = SomeCom.GetObject(); comObject.Object.DoSomething();
猜你喜欢
  • 2010-12-07
  • 2012-09-15
  • 1970-01-01
  • 2019-03-02
  • 2021-07-21
  • 2019-04-10
  • 2019-08-04
  • 2011-10-02
  • 2015-03-19
相关资源
最近更新 更多