欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ArcGIS Engine 开发 (二)C#new一个接口成功的原因,出现无法嵌入互操作类型的问题的解决

程序员文章站 2022-05-22 11:19:45
...

问题来源:

在调用ESRI.ArcGIS.esriSystem中的IObjectCopy接口时我通过它的实现类ObjectCopyClass初始化对其赋值时出现了无法嵌入互操作类型的错误

ArcGIS Engine 开发 (二)C#new一个接口成功的原因,出现无法嵌入互操作类型的问题的解决

但是如果对IObjectCopy的赋值为ObjectCopy的实例对象IObjectCopy objectCopy = new ObjectCopy();则完全没有问题。

ArcGIS Engine 开发 (二)C#new一个接口成功的原因,出现无法嵌入互操作类型的问题的解决

但在我们所学知识里接口和抽象类都是不能直接实例(new)的,肯定通不过编译器的编译。

原因:

首先看一下两个接口和一个实现接口的类的源码:

实现接口的类ObjectCopyClass
实现了两个接口IObjectCopy和ObjectCopy;
包含一个构造函数,和两个方法。

ArcGIS Engine 开发 (二)C#new一个接口成功的原因,出现无法嵌入互操作类型的问题的解决

接口ObjectCopy
继承了IObjectCopy接口。

ArcGIS Engine 开发 (二)C#new一个接口成功的原因,出现无法嵌入互操作类型的问题的解决

接口IObjectCopy
包含两个方法头。

ArcGIS Engine 开发 (二)C#new一个接口成功的原因,出现无法嵌入互操作类型的问题的解决

既然ObjectCopyClass是实现接口IObjectCopy的类,则报错的这种方法IObjectCopy objectCopy = new ObjectCopyClass();是绝对没有错误的。
错误原因在于:
没有修改COM组件的属性中的嵌入互操作类型。

何为 “嵌入互操作类型” ???

  1. ”嵌入互操作类型”中的嵌入就是引进、导入的意思,类似于c#中using,c中include的作用,目的是告诉编译器是否要把互操作类型引入。

  2. “互操作类型”实际是指一系列Com组件的程序集,是公共运行库中库文件,类似于编译好的类,接口等。

  3. “嵌入互操作类型”设定为true,实际上就是不引入互操作集(编译时候放弃Com程序集),仅编译用户代码的程序集。而设定为false的话,实际就是需要从互操作程序集中获取 COM 类型的类型信息。
 
参考:http://www.cnblogs.com/pnljs/archive/2012/02/20/2359313.html


new一个接口成功的原因

IObjectCopy objectCopy = new ObjectCopy();

其实源码里在定义接口时同时定义了它的实现类coClass和唯一标识Guid,这个接口被这两个特性修饰的。

coClass这个特性指示编译器在编译IObjectCopy的时候,使用ObjectCopyClass来实现。。

查看ObjectCopy生成的声明,它可以能有一个与ObjectCopyClass关联的Guid,可以用于创建一个ObjectCopyClass对象实例。

    // 摘要:
    //     CoClass to copy objects by value.
    [Guid("9C3673EA-BC0A-11D5-A9DF-00104BB6FC1C")]
    [CoClass(typeof(ObjectCopyClass))]
    public interface ObjectCopy : IObjectCopy
    {
    }

参考:https://www.jb51.net/article/36746.htm

相关标签: C# Interface

上一篇: 接口interface

下一篇: Java注解