创建COM互操作类的实例

我试图使用C#在我的程序中打开CorelDRAW。 到目前为止,我已经能够通过引用适当的com库和调用来实现

CorelDRAW.Application draw = new CorelDRAW.Application(); draw.Visible = true; 

但是,我希望我的程序能够与支持互操作的任何版本的CorelDRAW一起使用。 我试图在运行时使用reflection来加载互操作库,其中可以为正确的版本选择特定的dll。 从环顾四周,我尝试了以下内容。

 string path = "Interop.CorelDRAW.dll"; Assembly u = Assembly.LoadFile(path); Type testType = u.GetType("CorelDRAW.Application"); if (testType != null) { object draw = u.CreateInstance("CorelDRAW.Application"); FieldInfo fi = testType.GetField("Visible"); fi.SetValue(draw, true); } 

该程序在u.CreateInstance...失败u.CreateInstance...失败,因为CorelDRAW.Application是一个接口,而不是一个类。 我还尝试用CorelDRAW.Application替换CorelDRAW.Application ,因为当我浏览Interop.CorelDRAW作为资源时可用,但随后u.getType...失败。

我怎样才能让它发挥作用? 谢谢!

您可以使用以下构造创建已注册ActiveX对象的实例:

 Type type = Type.GetTypeFromProgID("CorelDRAW.Application", true); object vc = Activator.CreateInstance(type); 

然后你有3个选项,关于如何使用返回的对象。

  1. 将返回的对象转换为真正的CorelDRAW.Application接口,但为此你需要引用一些包含它的CorelDraw库,这可能会产生版本问题。

  2. 您在问题中提到的反思。

  3. 使用动态关键字,因此您可以调用现有的方法和属性,就像它是真正的CorelDraw类/接口一样。

     Type type = Type.GetTypeFromProgID("CorelDRAW.Application", true); dynamic vc = (dynamic)Activator.CreateInstance(type); vc.Visible = true; 
  System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom(fullPath); dynamic app = assembly.CreateInstance("CorelDRAW.ApplicationClass", true); 

这会奏效