次のプロジェクト構造があります。
Library1 <--[project reference]-- Library2 <--[ref]-- Executable
-------- -------- ----------
ContentFile .cs files .cs files
.cs files
すべてのプロジェクト参照には、CopyLocal = true があります。
プロジェクトをビルドすると、の出力ディレクトリにContentFile
はコピーされLibrary2
ますが、 の出力ディレクトリにはコピーされません。つまり、アプリケーションExecutable
の実行時に実行可能ファイルが見つからないということです。ContentFile
コンテンツ ファイルがLibrary2
の出力ディレクトリにコピーされているのに、 のディレクトリにはコピーされていないExecutable
のはなぜですか? それを後者にもコピーする方法はありますか(人々がそれを忘れると確信しているので、ビルドイベントなしでそれを行いたいです)?
合理的で保守可能なソリューションを探しています。新しいプロジェクトや間接的に参照される新しいコンテンツ ファイルを追加するときに最小限の労力しか必要としないため、単純にそれを忘れる可能性は限りなく低くなります。
ビルド後のイベントの使用 (などxcopy ../Library/bin/Debug/SomeDll.dll bin/Debug
); $(SolutionDir)/bin/...
プロジェクトの出力ディレクトリをデフォルト (プロジェクト単位) の代わりに手動で設定すると、どちらもすぐに大混乱になりました。「メイン プロジェクト」にコンテンツ ファイルをリンクとして追加するのも面倒でした。C# が Visual C++ と同じ出力ファイルのデフォルト設定 (つまり ) を持っていれば問題あり$SolutionDir/$Platform/$Configuration
ませんが、そうではありません。
また、標準の MSBuild 手順をまったく使用せず、カスタム ビルド ターゲット (Atmel Studio で gcc を使用するなど) を作成することも検討しましたが、まったくうまくいきませんでした。さらに、Visual Studio の標準の「ビルド」および「デバッグ」コマンドを通常どおりに動作させたいと考えています。
アップデート:
ここに私が何をしているかの詳細があります。
私はプロジェクトで解決策を持っていExecutable
ます。さらに、s と呼べるプロジェクトがたくさんありますPlugin
。マネージド プロジェクト参照を介してExecutable
これらすべての を参照します。Plugin
プラグイン プロジェクトは実行可能ファイルに合わせて調整されていますが、再利用可能なコンポーネントが含まれている可能性があるため、主な機能はプロジェクトに実装されることが多くExternal
、Plugin
プロジェクトは単なるラッパーのままです (常にではありません)。
これらExternal
のプロジェクトでは、サードパーティが提供するネイティブ DLL を使用することがあります。これらの DLL はExternal
、コンテンツ ファイルとしてプロジェクトに追加さCopy to output dir
れ、 Copy always
. したがって、構造は上の図のようになります。
External <---------------[is not aware of]--------------------+
-------- |
.cs files <--[reference]-- PluginWrapper <--[reference]-- Executable
"Native DLL" ------------- ----------
.cs files .cs files
奇妙なことに、「ネイティブ DLL」はExternal
の出力ディレクトリ (明らかに) と の出力ディレクトリにコピーされますが、の出力ディレクトリにはコピーされ ません。PluginWrapper
Executable
開発者のワークフローはExternal
、完全に分離されたエンティティとして機能する を記述し (非常に頻繁に再利用されます)、 でラップし、へPluginWrapper
のプロジェクト参照のみを追加することになります。これが明らかに珍しいことであることは奇妙だと思います。PluginWrapper
Executable
の MSBuild ターゲット XMLを編集Executable
する (間接的に参照されるコンテンツ ファイルも含める) ことで、問題が解決したのではないかと考えました。
提案されているように、組み込みリソースとして DLL をプロジェクトに追加することを検討したいかもしれませんが、そのようなネイティブ DLL を埋め込むことは私には奇妙に思えます。最終的に、Brenda Bell が提案したように、上の図から「[is not know of]」を取り除き、プロジェクト参照を に追加して開発者のワークフローを変更することは、External
理想的ではないにしても、最も賢明な解決策かもしれません。
更新 2
埋め込みリソースのアイデアは、すべての場合に機能するとは限らないことに注意してください。実行可能ファイルのディレクトリ (cwd などではない) に依存関係を配置する必要がある場合、インストール フォルダーに管理者権限がないため (埋め込みリソースからファイルを解凍するため)、これが機能しない可能性があります。奇妙に聞こえますが、これは私たちが使用していたサードパーティ ライブラリの 1 つに深刻な問題がありました。