2016-10-31 138 views
2

我的公司有一個具有非常大的DLL(大約11 MB)的軟件產品,我已經分配了任務來減小其大小,方法是讓兩個或三個版本的DLL只允許在每個DLL中提供方法列表。當前的DLL有各種方法,但大多數客戶只使用某些方法取決於他們的行業。有條件訪問修飾符?

我有7個項目的溶液在它:兩個是C++的項目,和五個是C#。其中兩個C#項目調用C++項目的函數(使用dllexport),我認爲它被稱爲非託管代碼(請耐心等待,我是這個領域的新手,所以我不太瞭解這個術語 - 事實上我現在只是發現「public/private/protected/etc」被稱爲「訪問修飾符」!:-))

到目前爲止,我已經想出瞭如何定義與「#if」一起使用的解決方案範圍的預處理器常量。到目前爲止,我想出了下面創建三個DLL:

例如,類似下面是在的.cs文件之一:

#if DLL_FOR_INDUSTRY_A 
public void method_A(int arg1) 
#else 
private void method_A(int arg1) 
#endif 
{ 
    for (int x=0; x<arg1; x++) 
    { 
    // code here; 
    } 
} 

#if DLL_FOR_INDUSTRY_B 
public void method_B(int arg1) 
#else 
private void method_B(int arg1) 
#endif 
{ 
    // code here; 
} 

#if DLL_FOR_INDUSTRY_C 
public void method_C(int arg1) 
#else 
private void method_C(int arg1) 
#endif 
{ 
    // code here; 
} 

但我的問題是,我有大約400 +方法在整個DLL中!有些方法在我應該創建的新DLL中很常見。其中兩個新DLL將代表軟件版本(將其視爲「標準版」與「專業版」版本)。我還着眼於使用「[System.Diagnostics.Conditional]」,但如果方法是「public method_A(int x)」而不是類似「public void method_A(int x)」。如果我在現有方法中添加「void」,它會打破許多其他調用(噩夢!)另外,我不是這個領域的專家,所以我不知道哪種方法是更好的方法。

我question-沒有任何人有關於如何我應適當做這個更好的建議?更好的是,如果有人能夠指出我如何正確指導這樣的大型DLL可以「有條件」編譯,以便我可以設置預處理器常量來更改DLL結果。 (我試着編譯我上面展示的內容(只覆蓋了15個方法而不是400+,它的很多工作),但是DLL大小似乎沒有改變,不確定未使用的方法是否仍然被編譯到新的DLL中)

可以使訪問修飾符以更簡單的方式「有條件」嗎? (以便它們不會出現在輸出DLL中。)

請幫忙!我在Windows 7上使用Visual Studio 2015 & Windows 10. 對於任何能夠給我方向的人表示誠摯的感謝,在過去的5天裏,包括週末在內,我一直在這裏,但我沒有很好的解決方案。 :-(

+6

'public method_A(int x)'不僅僅是「一種方法」。它是一個構造函數。 – Abion47

+4

會使私人東西減少DLL的大小? –

+5

爲什麼不使用繼承?你絕對不想做像「如果client == x ... else if client == y ...」的東西 - 我曾在某個地方工作過,而且它很糟糕。 – EJoshuaS

回答

1

我建議在這裏使用繼承而不是條件編譯 - 例如,擁有一個基類,該基類包含所有行業使用的通用功能,以及包含特定行業功能的不同行業的實現。到

多個組件,讓大家一起共同功能的DLL與包含有關其特定行業代碼中的第二DLL一起。你絕對想要做很多的「如果」語句來執行我記得爲一家大約10年前的公司工作,他們的代碼有:

if (client == x) ... 
else if (client == y) ... 
else ... 

可以預見,這很快就變得很難維護。爲了記錄,代碼是在我到達之前編寫的,所以這不是我的錯;)。在他們的情況下,他們可以從使用Template Method Pattern而不是做特定於客戶端的推理中受益。 (在這種情況下,Strategy PatternFactory Pattern都是非常有用的)。