C 程式集別名

2022-09-02 06:48:09 字數 2334 閱讀 2724

雖然開發專案時很少遇到兩個相同完全限定名的型別(命名空間.類名),但偶然還是會遇到這種情況。比如,在某些情況下,專案中必須引用某程式集的新舊多個版本。通過使用外部程式集別名,可以將來自每個程式集的命名空間包裝在由別名命名的根級別命名空間中,從而使這些命名空間可以在同一檔案中使用。

msdn官方解釋:

注意這和單獨extern 關鍵字來使用非託管**(c++d等)不是一回事。

要引用兩個具有相同完全限定型別名的程式集, 例如:

extern alias gridv1;

extern alias gridv2;

每乙個外部別名宣告都引入乙個額外的根級別命名空間,它與全域性命名空間global平行,而不是在全域性命名空間內。 因此,通過使用根源於相應命名空間別名的完全限定名,可以無歧義地引用每個程式集的型別。在程式中,gridv1::grid 是來自 grid.dll 的網格控制項,而 gridv2::grid 是來自 grid20.dll 的網格控制項。

如下圖所示,一般所有程式集的別名都預設是global,將別名修改為其它名稱就可以extern alias 方式使用了。extern alias 一般需要寫在所有using 程式集名語句之前。

extern

alias v2;

using system;

visual studio中可以給乙個程式集起多個別名,用逗號隔開,所以下圖中屬性名顯示的是aliases而不是alias。

新建乙個解決方案,包括三個專案: 2個有相同命名空間的類庫專案,1個控制台測試專案。

classlibraryv1專案中cat類和puppy類如下:

using

system;

namespace

classlibrary}}

using

system;

namespace

classlibrary}}

classlibraryv2專案中cat類和puppy類如下:

using

system;

namespace

classlibrary}}

using

system;

namespace

classlibrary}}

然後testlibrary專案引用classlibraryv1和classlibraryv2。

1)測試只使用完全限定名不同的類

static

void main(string

args)

執行正常(這種情況是最普通的,雖然程式集的命名空間相同,但是型別不同)

2)測試使用完全限定名相同的類

首先,編譯器會報錯:無法判斷有歧義的型別。

這時,就需要更改程式集別名,如將classlibraryv1的別名從global改為v1,

執行結果:

遇到乙個改造程式,程式中大部分開發的**引用的是一家控制項廠商的最新版本(v15)。但是,程式引用的乙個a.dll是基於v13開發的(即a.dll用到了v13的某個型別)。首先,如果不引用v13到程式中,則編譯不通過(提示找不到某型別);然後引用v13後,也編譯報錯(很多態別存在歧義)。

最後解決方式是把v13的程式集別名改為非global(任意名都可以),程式中也沒有地方需要用extern alias,編譯成功後執行正常。

為什麼沒有用到extern alias?

猜測是因為該程式開發中並沒有直接用到v13的型別,只是引用的a.dll用到了v13; 程式執行時自身用到的v15程式集正常載入,a.dll也加載入記憶體,a.dll載入時根據其clr manifest描述來載入v13程式集。具體機制還需要深入學習下clr等相關知識。

C 之程式集

c 之程式集 程式集的定義 1.程式集是乙個或多個託管模組,以及一些資源檔案的邏輯組合。2.程式集是元件復用,以及實施安全策略和版本策略的最小單位。3.程式集是包含乙個或者多個型別定義檔案和資源檔案的集合。在程式集包含的所有檔案中,有乙個檔案用於儲存清單。清單是元資料部分中一組資料表的集合,其中包含...

C 程式集系列11,全域性程式集快取

全域性程式集快取 gac global assembly cache 用來存放可能被多次使用的強名稱程式集。當主程式需要引導程式集的時候,優先選擇到全域性程式集快取中去找尋需要的程式集。為什麼需要全域性程式集快取?假設程式a引用b程式集,程式c也引用b程式集,在這種情況下,可以把b程式集放到乙個全域...

C 程式集系列08,設定程式集版本

區別乙個程式集,不僅僅是程式集名稱,還包括程式集版本 程式集公匙 程式集文化等,本篇體驗通過介面和編碼設定程式集版本。通過visual studio設定程式集版本 右鍵專案,選擇 屬性 選擇 應用程式 點選 程式集資訊 設定如下,點選確定 點選專案properties資料夾下的assemblyinf...