2009-07-03 53 views
3

我們有一個產品使用來自第三方供應商的參考。隨着他們新產品的發佈,他們將這個參考文獻重新命名爲新名稱。產品發佈更改其庫名稱,如何兼容新舊版本?

我們想要做的是編譯我們的應用程序的一個版本,以便它可以針對庫的舊名稱和新名稱運行。

在我們使用的庫的各個部分之間基本上沒有變化,只有1個方法重命名,但我不知道如何開發我們的應用程序來處理兩者。

如果我必須我們可以分支代碼來處理兩者,但我真的很想擁有某種適配器,所有的調用都會通過,然後調用舊的或新的。

一旦我安裝新的應用程序,它將刪除舊的庫,所以舊的代碼將不會編譯。

任何可以嘗試的指針或我可以如何解決此問題?

此外,應用程序是在C#中使用Visual Studio開發的2005

回答

3

Assembly Binding Redirection ...您可以將舊的DLL引用重定向到新的DLL引用。你將需要爲重命名的方法編寫一個包裝方法。這是一個真正的痛苦。我要spitball這一關我的頭頂部,所以我不保證名準確性或compilability,但你可以認爲這是僞代碼...

private bool _useOldMethodName = false; 
public void MethodAlias(string arg1) 
{ 
    if (_useOldMethodName) 
    { 
     Reference.OldFunctionName(arg1); 
    } 
    else 
    { 
     try 
     { 
      Reference.NewFunctionName(arg1); 
     } 
     catch (MethodNotFoundException mnfe) 
     { 
      _useOldMethodName = true; 
     } 
    } 
} 

類似的東西。這在任何情況下都不理想。

我很好奇,爲什麼你不能總是使用新的參考?只需將您的代碼分發給新的參考DLL,並且您永遠不會有問題...

+0

我們不控制此庫所在的應用程序以及它的一個更大的系統的一部分。我們有一個插件,通過它提供的API進行對話來完成一些功能。 我曾經在同一臺機器上安裝舊版和新版dll,他們確實似乎有效,但那只是一個小測試,我不確定它是否會造成更多的傷害。 我喜歡重定向的想法,並會給它一個旋轉,看看我能想出什麼。謝謝。 – stevemac 2009-07-07 22:47:53

1

我建議你以下步驟:

  • 重構代碼具有自己的類以調用庫隔離它從庫中繼承(現在沒有自己的方法 - 只是一個單一的變化位置)
  • 在這個單獨的類中使用反射來找出哪兩種方法可用。當您非常頻繁地調用庫時,請緩存實際的方法以避免性能損失。實際反射將如下所示:

    Type type = Type.GetType(alien); MemberInfo [] mbrInfoArray = type.GetMethods();

將使用Invoke調用該方法。

相關問題