🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

2回答

12136閲覧

Visual Studio 「プロジェクト参照」と「DLL参照」の使用について

heroherohero

総合スコア38

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

1クリップ

投稿2019/10/09 01:59

編集2019/10/09 02:56

実現したいこと

C#、Visual Studioを使って、Webサイトの開発を行っております。
その時に、表題の件でいくつか、皆さんのご意見を伺いたく、投降いたしました。

実現したいこと

AのWebサイトをビルドした時に、B.dllのみを配備するようにするようにするには、どのようにしたらよろしいでしょうか。

試したこと・考えたこと

図のようなソリューションが存在する際に、AのWebサイトが存在する場合に、
Bのdllプロジェクトで生成されるDLL(以下、B.dll)を利用したいと考えております。

その時に、AのWebサイトでBのdllプロジェクトを「プロジェクト参照」をすると、
AのWebサイトのBin直下に、BのdllプロジェクトでB.dllを生成するために利用ている
dllなども一緒に配備されてしまいます。

なぜこのような動きをするのでしょうか。

AのWebサイトで呼び出していないdllなのであれば、B.dll以外のdllは不要ではないのかと思うのですが、
いかがでしょうか。

また、本番環境に反映させるときは、不要なB.dllは配備したくないと考えているため、
B.dllしか配備しないようにしようかと思っておりますが、
こちらについて、皆さんいかがお考えでしょうか。

また、上記のような状況が気持ち悪かったため、「プロジェクト参照」ではなく、「dll参照」を
行ったところ、AのWebサイトのビルドを行った時に、B.dllが最新化されませんでした。

以上を踏まえ、上記の「実現したいこと」を実現したいと考えております。

どうぞ、よろしくお願いいたします。

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/10/09 02:23

ASP.NET の Web アプリの話と理解していますが、そうであれば ASP.NET のタグを付けてください。
heroherohero

2019/10/09 02:57

コメントありがとうございます。 はい、おっしゃる通りです。 そのため、ASP.Netのタグを付与しました。 よろしくお願いいたします。
guest

回答2

0

ベストアンサー

Zuishin さんの回答とダブるところがありますが・・・

質問に書いてある A が ASP.NET MVC などの Web アプリのプロジェクト、B は A が使う自作クラスライブラリのプロジェクトと理解してレスします。

AのWebサイトで呼び出していないdllなのであれば、B.dll以外のdllは不要ではないのかと思うのですが、いかがでしょうか。

A が直接呼び出さなくても、A が B を呼び出すと、B がその .dll を呼び出すのではないですか? そうであれば、A のプロジェクトの bin フォルダに B のプロジェクトの bin フォルダの .dll が配置されていないと Web アプリは動かないということになるはずです。

例えば、Class1.cs というクラスライブラリをプロジェクトとして追加し、それを Web アプリのプロジェクト側から「プロジェクト参照」したとします。そして、クラスライブラリに Newtonsoft.Json を NuGet で追加したとします。以下の画像を見てください。

イメージ説明

上の画像の通り Newtonsoft.Json 参照プロパティの「ローカルにコピー」が Ture となっているのでクラスライブラリの bin フォルダには Newtonsoft.Json.dll が配置されます。

Web アプリのプロジェクトを実行すると、以下の画像の依存関係に従って、クラスライブラリプロジェクトがビルドされ、クラスライブラリの bin フォルダから Web アプリの bin フォルダに必要な .dll(ClassLibrary1.dll と Newtonsoft.Json.dll)がコピーされ、その後 Web アプリがビルドされるはずです。

イメージ説明

クラスライブラリプロジェクトの参照設定で「ローカルにコピー」が False となっていれば bin フォルダにはコピーされてないはずです。確認してみてください。

また、上記のような状況が気持ち悪かったため、「プロジェクト参照」ではなく、「dll参照」を行ったところ、AのWebサイトのビルドを行った時に、B.dllが最新化されませんでした。

それは NG です。上に書いたように依存関係がありますので、それを維持するには「プロジェクト参照」が必要です。

ASP.NET の bin フォルダには以下の記事に書いてあるような特別な意味もあります。一読してみることをお勧めします。

Shared Code Folders in ASP.NET Web Sites
https://docs.microsoft.com/en-us/previous-versions/aspnet/t990ks23(v=vs.100)

bin フォルダについては以下の記述に注目です。

"You can store compiled assemblies in the Bin folder, and other code anywhere in the Web application (such as code for pages) automatically references it. A typical example is that you have the compiled code for a custom class. You can copy the compiled assembly to the Bin folder of your Web application and the class is then available to all pages."

投稿2019/10/09 04:08

編集2019/10/09 04:21
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

heroherohero

2019/10/09 04:45

コメント、ありがとうございます。 非常に勉強になります。 >質問に書いてある A が ASP.NET MVC などの Web アプリのプロジェクト、B は A が使う自作クラスライブラリのプロジェクトと理解してレスします。 はい、おっしゃる通りです。言葉足らずで申し訳ございません。 > A が直接呼び出さなくても、A が B を呼び出すと、B がその .dll を呼び出すのではないですか? はい、おっしゃる通りです。 Zuishin様と、SurferOnWww様の、コメントから推測にするに、B.dll以外も必要だと理解いたしました。 おそらく、B.dllだけで問題なく動いていたのは、以下の理由からではないかなと思ったのですが、このような理解であっていますでしょうか。 ■現状: AのWebサイトがB.dllのほんの一部のメソッドしか利用しておりません。 そして、そのメソッドがBプロジェクトのBin直下にある、dllを利用していないから。 ※説明が不足していて申し訳ございません。。。 どうぞよろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2019/10/09 05:01

> B.dllだけで問題なく動いていたのは、以下の理由からではないかなと思ったのですが、 その時の事情は私のような第三者は知る由もないですが、可能性としてたまたま使ってなかったから問題なかったということははあると思います。 または、ソースコードを入手してそれをプロジェクトに含めて一緒にコンパイルしたのかもしれません。(たとえば、上に書いた Newtonsoft.Json の場合ソースファイルが入手できるので、それをプロジェクトに含めてコンパイルすれば、生成されるのは ClassLibrary1.dll のみになる) あとは、GAC にあるとか。 使わなければ不要というのは Web アプリの方でも同じで、Web アプリの bin フォルダを見ると山ほど .dll が配置されていると思いますが、使わないものもあるはずなので、使わなければ参照設定から外しても(bin の .dll を配置しなくても)大丈夫でしょう。
heroherohero

2019/10/09 05:49

コメント、ありがとうございます。 >その時の事情は私のような第三者は知る由もないですが、可能性としてたまたま使ってなかったから問題なかったということははあると思います。 ありがとうございます。恐らく、今回の場合は上記の書いてくださっているもので、間違いないような気がします。 また、2点目のような考えはなかったっため、そのような可能性もあるということを認識しておきたいと思います。 >使わなければ不要というのは Web アプリの方でも同じで、Web アプリの bin フォルダを見ると山ほど .dll が配置されていると思いますが、使わないものもあるはずなので、使わなければ参照設定から外しても(bin の .dll を配置しなくても)大丈夫でしょう。 ありがとうございます。ですが、Zuishin様のコメントにもあるように、DELL HELL が怖いので、使っていない場合でも、今後は含めるようにしたいなと思います。ありがとうございました。 GACの記事も、拝見にさせていただきます。 よろしくお願いいたします。
guest

0

B を作成するために使用している dll ではなく、B が実行時に使用する dll と考えてください。A が B を使用する以上、必要な dll です。

投稿2019/10/09 02:07

Zuishin

総合スコア28669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

heroherohero

2019/10/09 03:24

コメント、ありがとうございます。 なるほど、そのような理解なのでですね、それだと合点がいきます。 そうすると、本番でAのWebサイトを稼働させるときにも、B.dll以外も必要なのでしょうか。 以前は、B.dllだけをAのWebサイトのBin直下に配備して動いていたのですが。。。。 よろしくお願いいたします。
Zuishin

2019/10/09 03:26

別途インストールされていなければ必要です。インストールされている場合も、DLL Hell 対策で必要になるかもしれません。
heroherohero

2019/10/09 04:50

コメント、ありがとうございます。 承知いたしました。DLL HELLのためにも、必要なのですね。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問