我正在尝试使用C#从我的程序中打开CorelDRAW。到目前为止,我已经能够通过引用适当的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 :(得分:4)
您可以使用以下构造创建已注册ActiveX对象的实例:
Type type = Type.GetTypeFromProgID("CorelDRAW.Application", true);
object vc = Activator.CreateInstance(type);
然后你有3个选项,关于如何使用返回的对象。
将返回的对象转换为真正的CorelDRAW.Application接口,但为此您需要引用一些包含它的CorelDraw库,这可能会产生版本问题。
您在问题中提到的反思。
使用dynamic关键字,因此您可以调用现有的方法和属性,就像它是真正的CorelDraw类/接口一样。
Type type = Type.GetTypeFromProgID("CorelDRAW.Application", true);
dynamic vc = (dynamic)Activator.CreateInstance(type);
vc.Visible = true;
答案 1 :(得分:1)
System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom(fullPath);
dynamic app = assembly.CreateInstance("CorelDRAW.ApplicationClass", true);
这会起作用