2010-06-10 49 views
29

我正在遷移使用C++編寫的具有C#包裝的庫。 C#的包裝(LibWrapper)與命名空間一組類,如:在兩個程序集中具有相同名稱的類(有意)

namespace MyNamespace 
    class MyClass 
    class MyOtherClass 

我的新圖書館,LibraryCS包含相同的命名空間和類名作爲LibWrapper(每用戶要求),所以我也有:

namespace MyNamespace 
    class MyClass 
    class MyOtherClass 

既然完成了遷移,我正在創建一個測試,比較使用這兩個庫的結果來驗證遷移。但是,當我嘗試引用MyNamespace.MyClass時,出現一個編譯器錯誤(預計!),它說「MyNamespace.MyClass在LibWrapper和LibraryCS中都定義了」。

圍繞這個問題是否有任何竅門,這將允許我在同一客戶端代碼中使用兩個具有完全相同名稱但來自不同程序集的類?

另外,有沒有其他的方式來測試這個?

將遷移的名稱空間重命名爲類似MyNamespace2的東西當然會起作用,但我們被要求不要這樣做,以便讓客戶端代碼更易於遷移。

+0

圍繞另一個名稱空間中存在的某個類編寫一個包裝會不會好? – Goblin 2010-06-10 20:56:26

+0

如果我能夠在相同的測試代碼中運行這兩個代碼,它可能是可以接受的。它將是一個僅用於測試目的的包裝。 – pgb 2010-06-10 21:03:19

回答

54

您可以使用extern alias從不同的組件相同的完全限定名稱引用類型。選擇對LibraryCS的引用並將屬性頁中的別名從「全局」更新爲「LibraryCS」,並將extern alias LibraryCS;添加到源文件的頂部,然後可以使用LibraryCS::MyNamespace.MyClass來引用LibraryCS中的類。您可以使用MyNamespace.MyClassglobal::MyNamespace.MyClass來引用LibWrapper中的類,也可以使用該引用的別名。

+4

我同意Quartermeister。請參閱以下內容以獲取更多參考: http://blogs.msdn.com/b/ansonh/archive/2006/09/27/774692.aspx – Kari 2010-06-11 17:01:39

0

您可以在運行時加載第一個程序集,然後使用反射來實例化它並執行它的方法。然後卸載該程序集,加載第二個程序集並使用反射來創建它並運行它的方法。

它可能會更容易使用2個獨立的過程,然後比較所產生的輸出...

+1

您不能直接卸載程序集,只能卸載AppDomain。爲了做到這一點,你需要一個單獨的appdomain與該程序集。 – 2010-06-10 21:13:21

+0

好的調用,將不得不取下AppDomain卸載程序集,我將編輯響應。 – 2010-06-10 22:34:55

1

看到這個問題和答案,它幫助了我。對於那些需要詳細解釋的人來說,我發現一個link真的很有用。

從鏈接中提取。

在一個應用

步驟1使用不同版本的相同的dll:使用VS IDE。在客戶端應用程序解決方案中添加對這兩個dll的引用。然後在參考節點下的解決方案資源管理器中選擇第一個(舊版本)類庫。在屬性窗口中將Aliases字段從全局更改爲oldVer。 lly,newVer N ewer版本

第2步:在您計劃引用它

extern alias oldVer; 
extern alias newVer; 

使用現在使用下面的代碼作爲第一個發言,

Console.WriteLine(oldVer::MyLibrary.MyClass.method()); 
Console.WriteLine(newVer::MyLibrary.MyClass.method()); 

希望這有助於。

相關問題