2012-10-17 37 views
4

我想从我的程序中使用C#打开CorelDRAW。到目前为止,我已经能够做到这一点通过引用相应的COM库,并呼吁创建一个COM互操作类的实例

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

不过,我想我的程序与支持互操作的CorelDRAW任何版本的工作。我正在尝试在运行时使用反射来加载互操作库,其中可以为正确的版本选择特定的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...失败,因为CorelDRAW.Application是一个接口,不是类。我也尝试将CorelDRAW.Application替换为CorelDRAW.ApplicationClass,因为当我通过Interop.CorelDRAW作为资源浏览时可用,但是u.getType...失败。

我该如何得到这个工作?谢谢!

+0

我已经得到这方面的工作在一定程度上。我在C#解决方案中创建了5个额外的项目,每个项目都包含对特定版本Corel的引用。然后该项目有一个函数返回我的CorelDRAW.Application对象。然后我可以在主程序中使用该对象的反射。不是最干净的,但到目前为止,这已经足够了。 –

回答

4

您可以使用下面的结构在注册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; 
    
1
System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom(fullPath); 
    dynamic app = assembly.CreateInstance("CorelDRAW.ApplicationClass", true); 

这是要去工作