首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建COM interop类的实例

创建COM interop类的实例
EN

Stack Overflow用户
提问于 2012-10-17 10:09:28
回答 2查看 6K关注 0票数 4

我正在尝试使用C#从我的程序中打开CorelDRAW。到目前为止,我已经能够通过引用适当的com库并调用

代码语言:javascript
复制
CorelDRAW.Application draw = new CorelDRAW.Application();
draw.Visible = true; 

但是,我希望我的程序可以与任何支持互操作的CorelDRAW版本一起工作。我正在尝试使用反射在运行时加载互操作库,其中可以为正确的版本选择特定的dll。

代码语言:javascript
复制
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.ApplicationClass替换CorelDRAW.Application,因为当我将Interop.CorelDRAW作为资源浏览时,它是可用的,但是u.getType...失败了。

我怎么才能让它工作呢?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-23 05:52:37

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

代码语言:javascript
复制
Type type = Type.GetTypeFromProgID("CorelDRAW.Application", true);
object vc = Activator.CreateInstance(type);

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

  1. 将返回的对象转换为真正的CorelDRAW.Application接口,但是为此你需要引用一些包含它的CorelDraw库,这可能会产生你在问题中提到的版本控制problems.
  2. Reflection,。
  3. 使用动态关键字,所以你可以像调用真正的CorelDraw类/接口一样调用现有的方法和属性。

类型类型= Type.GetTypeFromProgID("CorelDRAW.Application",true);动态vc =(动态)Activator.CreateInstance(类型);vc.Visible = true;

票数 4
EN

Stack Overflow用户

发布于 2013-11-13 00:43:53

代码语言:javascript
复制
  System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom(fullPath);
  dynamic app = assembly.CreateInstance("CorelDRAW.ApplicationClass", true);

这会起作用的

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12926102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档