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