2016-10-31 10 views
2

私の会社には、非常に大きなサイズのDLL(約11 MB)を持つソフトウェア製品があり、DLLの2つまたは3つのバージョンを各DLLのメソッドのリストのみに許可することによって、サイズを縮小するタスクが割り当てられています。現在のDLLにはすべてのメソッドがありますが、ほとんどのクライアントは業界に応じて特定のメソッドセットしか使用しません。条件付きアクセス修飾子?

私はそれに7つのプロジェクトがあります:2つはC++プロジェクトであり、5つはC#です。 2つのC#プロジェクトでは、C++プロジェクトの関数を(dllexportを使用して)呼び出すので、アンマネージコードと呼ばれていると思います(この分野の初心者ですので、私にはあまり知られていません。

これまで、 "#if"で使用するソリューション全体のプリプロセッサ定数を定義する方法を理解しました。これは、「public/private/protected/etc」が「アクセス修飾子」と呼ばれています。たとえば、次のようなものが.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を持っていることをこれまでのところ、私は3つのDLLを作成するには、次が出ています+ DLL全体の+メソッド!いくつかのメソッドは、私が作成するはずの新しいDLLの間で一般的になります。新しいDLLのうち2つはソフトウェア版を表します(「標準」vs「プロフェッショナル」版と見なします)。「[System.Diagnostics.Conditional]」も使用しましたが、メソッドが"public void method_A(int x)" "public method_A(int x)"ではなく、public method_A(int x)となります。もし私が既存のメソッドに "void"を追加すると、それは他の多くの呼び出しを悪化させます(悪夢!)さらに、私はこの分野の専門家ではないので、どちらの方が良い方法かも知りません。

私の質問 - どのように私はこれを正しく行う必要がありますか誰にも良い提案がありますか? DLLの結果を変更するためにプリプロセッサ定数を設定できるように、誰かが私にそのような大きなDLLを「条件付きで」コンパイルする方法について正しい方向に向けることができればさらに良いでしょう。 (私は上に示したものをコンパイルしようとしました(400+の代わりに約15のメソッドしか扱わなかった、その多くの作業)が、DLLのサイズは変更されていないようでした。未使用のメソッドがまだ新しいDLL 。)

アクセシビリティーは簡単に "条件付き"にすることができますか? (出力DLLに表示されないように)

助けてください!私はWindows 7上でVisual Studio 2015を使用しています& Windows 10 私はある方向を与えることができる人に心から感謝しています。私は週末を含む過去5日間これにいましたが、まだ良い解決策はありません。 :-(

+6

'public method_A(int x)'は単なる「メソッド」ではありません。それはコンストラクタです。 – Abion47

+4

ものをプライベートにするとDLLのサイズが小さくなりますか? –

+5

なぜ継承を使用しないのですか?あなたは間違いなく "クライアント== x ...他の場合はクライアント== y ..."のようなことをしたくないと思います - 私はどこかでそれをやったところで、維持するのは恐ろしい*でした。 – EJoshuaS

答えて

1

条件付きコンパイルよりも継承を使用することをお勧めします。たとえば、業界固有の機能を含むさまざまな業界のすべての業界および実装で使用される共通の機能を保持する基本クラスがあります。複数のアセンブリにまとめて、共通の機能を持つDLLと、その業界に関連するコードを含む2番目のDLLを提供します。ではなく、を実行するために多くのif文を実行します。業界特有のものです。約10年前の会社で、

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

予期せず、これはすぐに維持することが非常に困難になりました。記録のために、コードは私がそこに着く前に書かれていたので、私のせいではありませんでした;)。そのケースでは、クライアント固有の推論を行うのではなく、Template Method Patternを使用することで利益を得ることができました。 (Strategy PatternFactory Patternは、このような場合にはしばしば非常に役に立ちます)。

関連する問題