【问题标题】:Convert COM object to .Net Object将 COM 对象转换为 .Net 对象
【发布时间】: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 对象并获取它的属性。最简单的方法是什么?

【问题讨论】:

    标签: c# com components


    【解决方案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 对象。

    【讨论】:

      猜你喜欢
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 2012-09-15
      • 2011-06-03
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多