将 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 对象的主要内容,如果未能解决你的问题,请参考以下文章
将 IHTMLDocument2.Script.InvokeMember() 返回的 COM 对象转换为有用的东西
将 vb.net 类对象转换为 vb.net 中的 JSON 字符串
无法将类型为“Microsoft.Office.Interop.Word.ApplicationClass”的 COM 对象强制转换为接口类型