質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

87.36%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 10K+

score 34

実現したいこと

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が最新化されませんでした。

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

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

イメージ説明

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2019/10/09 11:23

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

    キャンセル

  • heroherohero

    2019/10/09 11:57

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

    キャンセル

回答 2

checkベストアンサー

+1

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 13: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 14:01

    > B.dllだけで問題なく動いていたのは、以下の理由からではないかなと思ったのですが、

    その時の事情は私のような第三者は知る由もないですが、可能性としてたまたま使ってなかったから問題なかったということははあると思います。

    または、ソースコードを入手してそれをプロジェクトに含めて一緒にコンパイルしたのかもしれません。(たとえば、上に書いた Newtonsoft.Json の場合ソースファイルが入手できるので、それをプロジェクトに含めてコンパイルすれば、生成されるのは ClassLibrary1.dll のみになる)

    あとは、GAC にあるとか。

    使わなければ不要というのは Web アプリの方でも同じで、Web アプリの bin フォルダを見ると山ほど .dll が配置されていると思いますが、使わないものもあるはずなので、使わなければ参照設定から外しても(bin の .dll を配置しなくても)大丈夫でしょう。

    キャンセル

  • 2019/10/09 14:07

    上に「あとは、GAC にあるとか。」と書きましたが、GAC か bin どちらの .dll を取得してくるかについては以下の記事が参考になると思います。

    ASP.net assembly loading from GAC or Bin
    https://blogs.msdn.microsoft.com/pranav_rastogi/2010/10/17/asp-net-assembly-loading-from-gac-or-bin/

    キャンセル

  • 2019/10/09 14:49

    コメント、ありがとうございます。

    >その時の事情は私のような第三者は知る由もないですが、可能性としてたまたま使ってなかったから問題なかったということははあると思います。

    ありがとうございます。恐らく、今回の場合は上記の書いてくださっているもので、間違いないような気がします。
    また、2点目のような考えはなかったっため、そのような可能性もあるということを認識しておきたいと思います。


    >使わなければ不要というのは Web アプリの方でも同じで、Web アプリの bin フォルダを見ると山ほど .dll が配置されていると思いますが、使わないものもあるはずなので、使わなければ参照設定から外しても(bin の .dll を配置しなくても)大丈夫でしょう。

    ありがとうございます。ですが、Zuishin様のコメントにもあるように、DELL HELL が怖いので、使っていない場合でも、今後は含めるようにしたいなと思います。ありがとうございました。

    GACの記事も、拝見にさせていただきます。

    よろしくお願いいたします。

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/09 12:24

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

    キャンセル

  • 2019/10/09 12:26

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

    キャンセル

  • 2019/10/09 13:50

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

    キャンセル

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

  • ただいまの回答率 87.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る