1. 程式人生 > >ArcGIS Engine 開發 (二)C#new一個介面成功的原因,出現無法嵌入互操作型別的問題的解決

ArcGIS Engine 開發 (二)C#new一個介面成功的原因,出現無法嵌入互操作型別的問題的解決

問題來源:

在呼叫ESRI.ArcGIS.esriSystem中的IObjectCopy介面時我通過它的實現類ObjectCopyClass初始化對其賦值時出現了無法嵌入互操作型別的錯誤

這裡寫圖片描述

但是如果對IObjectCopy的賦值為ObjectCopy的例項物件IObjectCopy objectCopy = new ObjectCopy();則完全沒有問題。

這裡寫圖片描述

但在我們所學知識裡介面和抽象類都是不能直接例項(new)的,肯定通不過編譯器的編譯。

原因:

首先看一下兩個介面和一個實現介面的類的原始碼:

實現介面的類ObjectCopyClass
實現了兩個介面IObjectCopy和ObjectCopy;
包含一個建構函式,和兩個方法。

這裡寫圖片描述

介面ObjectCopy
繼承了IObjectCopy介面。

這裡寫圖片描述

介面IObjectCopy
包含兩個方法頭。

這裡寫圖片描述

既然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
    {
    }