2010-01-22 51 views
1

我想發佈一個包含一些類供其他開發者使用的DLL。這些類的後面是包含引用功能的另一個DLL。在開發環境中,我希望這個後端DLL具有面向開發的功能,但是當代碼遷移到生產環境時,我希望後端DLL是真正的。什麼是切換後端DLL的最佳方式?基於環境的開關DLL - .net

謝謝你的幫助。

+0

你能對你的意思是「以發展爲導向的功能」,這只是額外的日誌記錄,有什麼擴張或你在一些顯著方式改變行爲? – ScottS 2010-01-22 20:00:39

+0

它不僅僅是記錄。我們正在使用trace/debug實現來關注日誌記錄。我想最好的答案是我們正在以一種重要的方式改變行爲。 – Sako73 2010-01-22 20:22:55

回答

0

使用.config文件來存儲要運行的程序集的名稱,以及何時爲空/缺少加載後端版本。 [更多]最簡單的方法是使用另一個包含共享接口的程序集。

+0

你能指點我一個如何做到這一點的例子嗎?再次感謝你。 – Sako73 2010-01-22 20:03:33

+0

我一直在試驗,看來只要我定義相同的類,並且DLL名稱保持不變,在目錄中物理更改DLL就可以正常工作。你知道這種方法有什麼問題嗎? – Sako73 2010-01-22 20:29:48

+0

一種方法是使用IOC工具,如Autofac http://code.google.com/p/autofac/。另一個是使用Assembly.Load或如本鏈接所述http://stackoverflow.com/questions/370286/c-interface-call-method-in-different-project-assembly – kenny 2010-01-23 00:11:58

-1

嘗試使用ConditionalAttribute標記您的「Developer Only」類。如:

[Conditional("DEBUG")] 
public class DeveloperClass 
{ 
    // ... 
} 

你也用這種方法標記方法。這比使用#if/#endif稍微清潔一些。通過這種方式,您可以共享所有源代碼,但只需使用解決方案配置即可更改構建的代碼。

+0

問題似乎是使用該屬性會調用或不調用該方法,但不會更改方法本身。然而,#if /#else /#endif似乎可以工作,並且只允許一組代碼文件。 – Sako73 2010-01-22 20:59:11

-1

因此,我認爲你的'發展'的DLL和'生產'DLL有相同的接口?

如果是這樣,那麼只需要在dll上有一個包裝器,並且Wrapper將包裝dll中的所有函數(這兩個版本的dll的接口是相同的)。

使用以下代碼加載庫,

if(PRODUCTION) { 
     target_lib = "productionlib.dll"; 
} else { 
     target_lib = "developmentlib.dll"; 
} 
lib = LoadLibrary(target_lib); 

包裝器將只向前的函數調用相應的加載庫(生產或開發庫如上所述)

functionptr=(LPFunctionType)GetProcAddress(lib,"TargetFunction"); 
if(functionptr) { functionptr(bs); } 
0

繼續從您的評論:

我一直在試驗,它 似乎只要我定義 相同的類,並且DLL名稱保持 相同,物理更改目錄中的DLL 工作正常。你是否知道這種方法的任何問題或 的崩潰?

這種方法的主要問題/缺點是確保您保持由鎖定步驟公開的兩個DLL公開的類/方法。也許是最好的方式做到這一點,因爲你似乎有典範:

PROGRAM -> REFERENCED DLL -> [One of two "Backend DLL's] 

是創建在「參考DLL」抽象類/接口指定的類/方法,無論是「後端DLL'「應該公開,然後讓後端DLL的引用爲」REFERENCED DLL「,並在抽象類/接口上實現實際的類。

例如,「Program」期望能夠在REFERENCED.DLL中使用稱爲「Logger」的類,該類使用BACKEND.DLL中名爲「BackEndLogger」的clas中的方法(無論是開發版還是生產版)。所以,在REFERENCED中。DLL有一個類,如:

public abstract class BackEndLogger 
{ 
    public virtual void LogEvent(string eventToLog) 
} 

然後,在「BACKEND.DLL」的兩個版本,有一個類,如:

public class Logger : BackEndLogger 
{ 
    public override void LogEvent(string eventToLog) 
    { 
    ... code for implementation goes here 
    } 
} 

REFERENCED.DLL將有一個名爲DLL的引用「BACKEND.DLL」,並且,因爲類接口完全相同(通過在REFERENCED.DLL中實現抽象類/接口保持同步,從而保證了它們的完全相同)將不會更聰明。

希望這做某種意義=)