将 COM 对象转换为 .Net 对象

Posted

技术标签:

【中文标题】将 COM 对象转换为 .Net 对象【英文标题】:Convert COM object to .Net Object 【发布时间】:2010-12-07 03:46:43 【问题描述】:
public int Set(int newValue,Object obj)

  //System.Windows.Forms.Control ctrl = (System.Windows.FormsControl)Object;

这里的Object是COM对象。现在我想将它转换为 .NET 对象并获取它的属性。最简单的方法是什么?

【问题讨论】:

【参考方案1】:

您不能直接将 COM 对象转换为 Windows.Forms.Control 对象。它不是那种特定的类型。

如果您使用正确的类型库,COM 对象应该为您提供它自己的属性。如果您将其转换为适当的类型,您应该能够直接使用它的属性。

【讨论】:

Set obj1 = SwfWindow("Form1").SwfObject("radioGroup").Object Set obj = DotNetFactory.CreateInstance("QTCustServer.RadioGroupSrv1", "C:..My Documents/Visual Studio 2005/Projects/QuickTestCustomServer2/bin/CustServer.dll") obj.Set 20,obj1 ...这里 obj1 是我传递给 Set 方法的 COM 对象。我知道这是一个 radioGroup 控件,但我不能像你说的那样直接投射它。将其转换为什么类型的合适? 我在QTP中使用vbscript来调用.net dll【参考方案2】:

所讨论的对象是 COM 对象这一事实不是问题。您不必将其转换为 .NET 对象,因为它已经是一个。您可以像获取任何其他没有类型信息的 .NET 对象一样获取此对象的属性,例如:

var objectType = obj.GetType();

foreach(var prop in objectType.GetProperties())

    Console.WriteLine("Property 0 of type 1", 
                        prop.Name, prop.PropertyType.Name);

要调用属性,您可以使用 Type 类的 InvokeMember 方法。以下是如何将对象上的“可见”属性(如果存在)设置为 true

objectType.InvokeMember("Visible", BindingFlags.SetProperty, 
                               null, obj, new object[]  true );

如果您使用的是 .NET 4 或 4.5,则可以使用 dynamic 关键字来更轻松地处理源自 COM 的 .NET 对象:

var xlAppType = Type.GetTypeFromProgID("Excel.Application");

dynamic xlApp = Activator.CreateInstance(xlAppType);

xlApp.Visible = true;

请注意,在最后一个示例中,Visible 属性的调用是如何免于使用咒语的。这些天来,我尝试尽可能使用动态来处理 COM 对象。

【讨论】:

以上是关于将 COM 对象转换为 .Net 对象的主要内容,如果未能解决你的问题,请参考以下文章

.NET:无法将对象转换为它实现的接口

将 IHTMLDocument2.Script.InvokeMember() 返回的 COM 对象转换为有用的东西

将 vb.net 类对象转换为 vb.net 中的 JSON 字符串

VB.NET 将对象转换为 JSON

无法将类型为“Microsoft.Office.Interop.Word.ApplicationClass”的 COM 对象强制转换为接口类型

将 XML 转换为 .net 中的对象