none
プロジェクトの参照について RRS feed

  • 質問

  • A.exeからB.exeのクラスを参照する場合、以下の内どちらにした方が良いですか?

    1.Aのプロジェクトから参照設定でBのプロジェクトを追加する。

    2.A.exeを実行時にB.exeを動的にロードする。

    2013年12月9日 9:36

回答

  • どちらでも構いません。一長一短ですが、それよりもなぜこのような疑問を持たれたのでしょうか? そこに答えがあるはずです。

    質問タイトルには「プロジェクトの参照」と書いていながら、2.の選択肢が候補に挙がった理由が、私気になります!

    • 回答としてマーク yty0918 2013年12月11日 7:18
    2013年12月9日 10:04
  • 基本的に参照設定に追加した方がクラス・構造体などの型をコード上で使えるようになるので開発効率が上がりますし、その2つの間の起動速度に有意な差はないはずなので、2は選択肢に通常挙がりません。(佐祐理さんが指摘されているとおり)

    ところで、exe から exe を参照することを考えているそうですが、共通部分をクラスライブラリに抽出することも考えた方がよいかもしれません。
    (過去に exe から exe を参照して変なことになった経験があったので、基本的に避けています。今も起こるかはわかりません、役立たない情報ですみません。。。)

    • 回答としてマーク yty0918 2013年12月11日 7:18
    2013年12月9日 13:12
    モデレータ

すべての返信

  • どちらでも構いません。一長一短ですが、それよりもなぜこのような疑問を持たれたのでしょうか? そこに答えがあるはずです。

    質問タイトルには「プロジェクトの参照」と書いていながら、2.の選択肢が候補に挙がった理由が、私気になります!

    • 回答としてマーク yty0918 2013年12月11日 7:18
    2013年12月9日 10:04
  • 基本的に参照設定に追加した方がクラス・構造体などの型をコード上で使えるようになるので開発効率が上がりますし、その2つの間の起動速度に有意な差はないはずなので、2は選択肢に通常挙がりません。(佐祐理さんが指摘されているとおり)

    ところで、exe から exe を参照することを考えているそうですが、共通部分をクラスライブラリに抽出することも考えた方がよいかもしれません。
    (過去に exe から exe を参照して変なことになった経験があったので、基本的に避けています。今も起こるかはわかりません、役立たない情報ですみません。。。)

    • 回答としてマーク yty0918 2013年12月11日 7:18
    2013年12月9日 13:12
    モデレータ
  • 佐祐理さん、Azuleanさん回答ありがとうございました。

    お二方の回答を元に検討した結果、

    「2.A.exeを実行時にB.exeを動的にロードする。」

    という方法を採用することにしました。

    というのはB.exeからA.exeを実行する可能性があり、その場合、

    B.exeからA.exeを実行してA.exeからプロジェクト参照でB.exeのクラスを使うと

    A.exeから実行中のB.exe内のデータを変更されるなどの問題が発生すると思われたためです(未検証ですが・・・)。

    本当はAzuleanさんの言われるとおり「共通部分をクラスライブラリに抽出する」方がいいんでしょうが、

    現状難しそうなのでまた時間があるときに抽出したいと思います。

    2013年12月11日 7:17
  • というのはB.exeからA.exeを実行する可能性があり、その場合、

    B.exeからA.exeを実行してA.exeからプロジェクト参照でB.exeのクラスを使うと

    A.exeから実行中のB.exe内のデータを変更されるなどの問題が発生すると思われたためです(未検証ですが・・・)。

    B.exeからA.exeを実行するというのが、プロセスとして起動するという意味であれば、こんなことは起こりませんので心配はいりません。

    また、仮にこんなことが起こるとして、その場合普通は動的ロードでも同じことが起こるので、あえて動的ロードを選択する利点はありません。
    コーディング上も普通は面倒になりますし。

    本当はAzuleanさんの言われるとおり「共通部分をクラスライブラリに抽出する」方がいいんでしょうが、

    現状難しそうなのでまた時間があるときに抽出したいと思います。

    まあ本当はこちらをお勧めするのですが…

    2013年12月11日 8:33
  • データというものは基本的にプロセスごとに独立しています。例えばB.exeを2つ立ち上げたとしてもそれぞれが干渉することはありません。

    このような発言は、コンパイル時と実行時を混同・混乱しているものと思われます。例えば、DateTime.Nowは実行時の現在時刻を返すもので、コンパイル時刻が得られるわけではないことは理解できていますよね? それと同じことです。

    Azuleanさんはお勧めされていませんが、私としては素直にB.exeを参照することをお勧めします。

    2013年12月12日 1:11
  • というのはB.exeからA.exeを実行する可能性があり、その場合、

    B.exeからA.exeを実行してA.exeからプロジェクト参照でB.exeのクラスを使うと

    A.exeから実行中のB.exe内のデータを変更されるなどの問題が発生すると思われたためです(未検証ですが・・・)。

    これについては他の方も回答されていますが、違う視点で補足しておきます。
    まず、他のexeを動的にロードするとか、他のexeを実行するというのは言語機能に基づくものです。一方で、プロジェクトの参照というのは、Visual Studioの機能に基づくものです。Visual Studioがどのような機能を持とうとも、最終的には言語機能で実現されます。そして、それは.NETという枠組みの中で動作します。
    Visual Studioの機能は、開発を支援するためのものです。そこで言語仕様に従って、どうコーディングするかによって動作が変ります。心配されているデータの変更は、動的にロードしたとしても、そのコーディングによって如何様にもなります。つまり、プロジェクトの参照と動的ロードは別の次元にあるということです。ただ通常は、プロジェクトの参照をすれば、動的ロードをすることはあまりないでしょう。なぜなら、プロジェクトの参照は、他のプロジェクトを巻き込み、あくまで一つのexeに集約することを目指して行うことだからです。

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年12月12日 2:23
    モデレータ