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

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

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

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

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

但在我们所学知识里接口和抽象类都是不能直接实例(new)的,肯定通不过编译器的编译。
###原因:
首先看一下两个接口和一个实现接口的类的源码:

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

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

接口ObjectCopy
继承了IObjectCopy接口。

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

接口IObjectCopy
包含两个方法头。

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

既然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#,ArcGIS,Engine,Arcgis二次开发入门)