2014-05-15 93 views
2

我被要求做一些不尋常的工作。我們有一些客戶端正在使用調用我們的DLL的應用程序(我們稱之爲Sdk.dll)。將呼叫動態重定向到其他程序集?

最近,有人決定在Sdk代碼中更改一些名稱空間。如果我們要爲我們的客戶提供這個新的DLL,他們的應用程序就會中斷。

然而,某些客戶端將被寫入使用DLL的新版本的應用程序(我們稱之爲Sdk.Updated.dll)。

我的任務就是以某種方式支持新老客戶端應用程序,而無需重新編譯應用程序的客戶端。

我以爲我可以簡單地用一個新的,它會將所有在Sdk.Updated.dll適當的被叫方來電取代舊Sdk.dll。但是,似乎爲每個命名空間更改的實例編寫包裝類會很乏味。

我想知道是否有人可能建議爲做到這一點更動態的方式?

所以,僅僅是明確的:

客戶1:

using Sdk; 

// ... 

int sum = new Calc().AddTwoNumbers(3, 4); 

客戶2:

using Sdk.Updated; 

// ... 

int sum = new Calc().AddTwoNumbers(3, 4); 

Sdk.Updated.dll:

namespace Sdk.Updated { 
    public class Calc { 
     public AddTwoNumbers(int x, int y) { 
      return x + y; 
     } 
    } 
} 

會是什麼是支持這兩個客戶端的最佳方式我們無法重新編譯客戶端應用程序的限制嗎?

(作爲一個額外的皺紋,一些方法名稱可能已經SDK和Sdk.Updated之間變化,但我寧願只得到如何處理第一次命名空間的事情的想法...)

+0

查看「[TypeForwardedTo]」和「[TypeForwardedFrom]」屬性。我相信這些用於處理移動定義組件的類型。 –

+0

嗯,回滾編輯。 –

+0

不幸的是,我們無法將其回滾。我們公司的名字最初是在命名空間中,並且由於各種原因(除了我的薪酬等級),它必須被刪除...... –

回答

1

後一些調查(包括使用命名空間別名,並構建一個使用反射動態生成包裝器DLL的工具),我們得出結論認爲沒有好的方法來做到這一點,而無需重新編譯客戶端應用程序。

事實上,命名空間不應該被改變,而不首先考慮客戶端應用程序的潛在影響。 (我敢肯定,這將是顯而易見的任何人閱讀本)。

希望這樣可以節省別人很多的時間和金錢,如果你被要求做同樣的事情。