将COM对象转换为.Net对象

时间:2009-10-15 19:00:31

标签: c# com components

public int Set(int newValue,Object obj)
{
  //System.Windows.Forms.Control ctrl = (System.Windows.FormsControl)Object;
}

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

有问题的对象是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对象。