【VB.NET】山のように大量の DLL がビルド出力パスに出力される

多数の DLL がビルド出力パスに出力される

いつものように VB.NET のプロジェクトをビルドしていたら、ビルド出力パスに山のように大量の DLL がコピーされているのに気付いた。

ちょっと待ってくれ・・・。これは困ったぞ。まさか、これらの DLL をすべてユーザーに渡さないとダメってこと?やめて~!違うと言って。

調査

気を落ち着つけて考えてみると、つい先日までこんなことは無かったわけである。何かおかしい。原因を調べてみることにした。

ネット検索してみたが、検索方法が悪いのかそもそも情報が少ないのか、納得のいく情報が得られない。

プロジェクトから参照している DLL の全てがいつのまにか「ローカルにコピー = True」になってたりするのだろうか・・・なってない。

そしてあれこれ調べて分かったのが、ターゲットフレームワークを「.NET Framework 4.6.1」または「.NET Framework 4.6.2」にすると多数の DLL がコピーされるが、「.NET Framework 4.6」(またはそれ以前)だとコピーされないということ。

そして、クラスライブラリ(.NET Standard)の DLL をプロジェクトから参照している場合にこの現象が起きている、ということも分かった。

「4.6.1 か 4.6.2 のバグかなぁ?」と思いつつ、参照しているクラスライブラリ(.NET Standard)を実際に使用したコードを書いて、ターゲットフレームワークを「4.6」(またはそれ以前)にしてプロジェクトをビルドした。そうすると今度は次のエラーが出た。

型 '[Object]' を含むアセンブリ 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' への参照が必要です。参照をプロジェクトに追加してください。

「参照の追加」から該当の DLL を探してみるが見つからないので、コードエディタ上でエラーになっている箇所にキャレットを置いてから、画面のメッセージ通りに Alt + Enter を押して再び Enter を押すと、netstandard がプロジェクトに追加された。

この状態でビルドしてみると、たくさんの DLL はコピーされない。

まとめ

  • クラスライブラリ(.NET Standard)の DLL をプロジェクトから参照している場合に、大量の DLL がコピーされる可能性がある。参照していなければ大丈夫。
  • クラスライブラリ(.NET Standard)の DLL をプロジェクトから参照していて、ターゲットフレームワークが「4.6」(またはそれ以前)で、その DLL のクラスを実際にプロジェクトで使用しているとき、netstandard を要求される。netstandard を追加してビルドすると、大量の DLL はコピーされない。
  • クラスライブラリ(.NET Standard)の DLL をプロジェクトから参照していて、ターゲットフレームワークが「4.6.1」または「4.6.2」の場合、netstandard を要求されることは無い。しかし、プロジェクトをビルドすると大量の DLL がコピーされる(ちなみに、参照している DLL のクラスを実際に使用していなくても大量の DLL がコピーされる)。

結論

クラスライブラリ(.NET Standard)の DLL をプロジェクトから参照するときは、ターゲットフレームワークは「4.6」(またはそれ以前)までに止めておいて、netstandard をプロジェクトに追加しておけば良い。そして、将来のフレームワークでは、DLL が大量にコピーされてしまう不具合(バグだと言ってくれ。「仕様だ」なんて言わないで~!)を Microsoft が修正してくれるのを期待する。

.NET Framework 4.7.1 以降

2018年9月27日現在、調べてみたら .NET Framework は 4.7.2 までリリースされていました(でもこのバージョンは、Windows 10 の初期の頃のバージョンにはプレインストールされてない点に注意)。

 

参考:.NET Framework のシステム要件 > サポートされているクライアント オペレーティング システム

 

.NET Framework 4.7.1 以降では .NET Standard の余計な DLL が出力されないような記事を見たので試してみたところ、出力される DLL の量が下記のように減りました(EeoInfoClass.dll は、私が作成した DLL です)。ずっとマシになりましたけどね・・・。う~~~ん。

まぁ、あまり新しいバージョンの Framework でない方が、たくさんのユーザーに負担かけずに使ってもらえるし。自分はまだ 4.5.1 あたりを使っとこうかな。

コメントの投稿

avatar
  購読する  
通知を受け取る対象