2012-09-11 7 views
5

.NET C#プロジェクトを複数のDLLにコンパイルしようとしています。しかしここに事がある。1つのプロジェクトを複数のdllにコンパイルする方法

これは私のプロジェクト構造です。

Bin 
Dir1 
Dir2 
File1.cs 
File2.cs 
myproject.csproj 

このプロジェクトをFile1.dllとFile2.dllにコンパイルします。 File1.dllとFile2.dllは、Dir1とDir2にあるさまざまな.csファイルでコードを使用します。サブディレクトリに存在する.csファイル内のこれらのクラスの一部は、File2.csによって必要とされ、他のクラスはFile2.csによって必要とされます。 File1.csとFile2.csの両方で使用されるものがあります。

私は次のように使用:

csc /t:library /out:File1.dll /recurse:*.cs 
csc /t:library /out:File2.dll /recurse:*.cs 

しかし、結果のDLLは、単に異なるファイル名を持つ互いの正確なコピーでした。私がそれらをコンパイルする方法はありますので、オブジェクトブラウザの各dllを調べると、File1.dllのFile1.csで参照されているDir1とDir2の.csファイルのクラスだけがありますFile2.dll?

私はこれをVisual Studioのポストビルドステップの一部として行うことをお勧めします。お時間を

おかげで...

EDITすべての回答について

感謝。ソリューションを多くのプロジェクトに分割するための提案が多数ありました。それはそれを行う一つの方法ですが、私は、File1.dllとFile2.dllという2つのdllのために作成された依存関係を必要とするかどうかはわかりません。私に説明させてください。

複数のプロジェクトを作成する際に見られる問題は、File1.csとFile2.csの両方に必要なコードがいくつかあることです。私はそれらを両方のプロジェクトで繰り返すことはしません。 3番目のプロジェクトで共通コードを保持すると、File1.dllとFile2.dllの両方に必要な3番目のdllが作成されます。私はこれを望んでいない。 File1.dllとFile2.dllだけを作成して、1つのプロジェクトにそれらを保存しておきたいのです。これをどうやって行うかについての提案はありますか?

返信いただきありがとうございます。

歓声。

+0

各 'dll'に提供する' .cs'ファイルの種類を指定する必要があります。これらが1つのプロジェクトに含まれているため、期待していなかった依存関係があることがわかります。 – Oded

+0

ありがとうございました。しかしそれは、プロジェクトの内容が変わるたびにスクリプトを変更する必要があることを意味します。または、少なくとも手動で変更をプロジェクト全体を分析します。参照されているクラスを、それらが入っているファイル/フォルダから自動的にリンクできるスイッチはありませんか?新しいファイルが必要な場合は、毎回VSにプロジェクトをビルドするたびに参照する必要があります。毎回毎回それらを含める必要はありません。 – user20358

+0

そうです。または、組み込みシステムとは異なるビルドシステムを使用しますが、同期させておく必要があります。プロジェクトを複数に分割するのが最も簡単です。 – Oded

答えて

9

各コンポーネントに別々のライブラリが必要な場合は、同じソリューション内でプロジェクトを複数のプロジェクトに分割する必要があります。

重複したコードの問題を避けるために、重複したコピー(Add as link)を作成せずに複数のプロジェクトに同じファイルを含めることができます。

+0

これはおそらく唯一の方法ではありません。 – Oded

+0

確かに、それを行うのは正しい方法です。 – PhonicUK

+0

私の質問を更新しました... – user20358

1

これを行うには複数のプロジェクトが必要です。複数のプロジェクトから同じCSファイルを参照するのを止めるものは何もありません。

また、論理グループ化が必要な場合は、両方のプロジェクトが1つのソリューションの下に存在することができます。

+0

私の質問が更新されました...また、複数のプロジェクトから同じCSファイルを参照するにはどうしたらいいですか? – user20358

+0

複数のプロジェクトを含むソリューションをお持ちの場合は、プロジェクト - >追加 - >既存項目 - のいずれかを右クリックし、追加する既存の.CSファイルを参照します。これはVS2010で動作しており、以前のバージョンでも動作することを確認しました。 – Sepster

2

生成するDLLごとに1つのプロジェクトを作成し、それぞれに固有のファイルを追加します。例えば、File1.cs(および必要に応じて他のファイル)を含むmyproject1.csprojと、File2.csを含むmyproject2.csprojがあります。その後、共通ファイルを含む3つ目のプロジェクトを作成し、最初の2つの共有アセンブリを参照します。

また、異なるコードを組み込んで除外したい場合は、#if文でプリプロセッサ定数をチェックすることを検討してください。

+0

アクルトンに感謝します。複数のプロジェクトを作成する際の問題は、File1.csとFile2.csの両方に必要なコードがいくつか存在することです。私はそれらを両方のプロジェクトで繰り返すことはしません。 3番目のプロジェクトに共通のコードを保持することは、File1.dllとFile2.dllの両方に必要な3番目のdllを意味します。私はこれを望んでいない。私はFile1.dllとFile2.dllだけを必要とします。なぜなら、私はそれらを両方とも1つのプロジェクトに保存しているからです。 – user20358

1

条件付きコンパイルシンボル(#if DLL1,#if DLL2)を使用できます。

ビルドステップで、/p:DefineConstantsオプションを指定してmsbuildを呼び出して、これらのシンボルを設定します。

MSBUILD /p:DefineConstants=DLL1 ... 

基本的に、条件付きコンパイルシンボルを2つ設定してプロジェクトを2回コンパイルします。

+0

ありがとうございました。私はこれがどのように機能するのか分かりません。 – user20358

+0

これらをプロジェクト構成の一部として設定すると、IDEで作業中に依存関係やコンパイルエラーの恩恵を受けることができます。 – StingyJack

関連する問題