.NET Framework で作成しているアプリケーションで、.NET Standard で作成されたライブラリを参照している場合、依存している dll が出力フォルダにコピーされませんでした。
環境
- Visual Studio 2017
- .NET Framework 4.6.1
- .NET Standard 2.0
依存関係
まず、説明の都合上以下のように定義します。
- .NET Framework で作成したアプリケーションを A とする
- .NET Standard で作成したライブラリを B とする
- その .NET Standard で作成されたライブラリが依存している他の dll などを C とする
依存関係は A -> B -> C のようになります。
このとき、A をビルドすると、出力フォルダに B の dll はコピーされるのですが、C の dll がコピーされないという状況になりました。
原因と解決策
NuGet のパッケージ管理には packages.config
形式と、PackageReference
形式があるようです。
packages.config
形式だと今回のような現象が起こるようで、PackageReference
形式に移行すれば解決します。
尚、.NET Core で新規にプロジェクトを作成した場合は PackageReference
形式になるようなので、今回のような問題は発生しません。
移行方法
Visual Studio で packages.config
から PackageReference
へマイグレーションすることができます。
ソリューションファイルを開き、プロジェクト内の packages.config
を右クリックします。
Migrate packages.config to PackageReference...
を選択するとマイグレーションの画面が表示されるので、OK を押すとマイグレーションが実行されます。
Migrate packages.config to PackageReference...
のメニューが表示されない場合は、Visual Studio の設定を見直してみてください。
NuGet のデフォルトのパッケージ管理方式が PackageReference
になっているとマイグレーションのメニューは表示されないようなので、packages.config
に変更してください。
尚、stackoverflow では .NET Framework で作成したアプリケーションのプロジェクトファイル (.csproj) を開き、PropertyGroup
に以下を追加すれば OK というのがありました。
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
しかし、この場合 package.config
で管理しているパッケージが未インストールされていない状態になるので、既に package.config
が存在する場合はマイグレーションを行ったほうが良いと思います。