none
参照設定に追加したアセンブリの取得方法 RRS feed

  • 質問

  • いつもお世話になっております。


     

    1つのソリューションに対し複数のプロジェクトがあります。

     

    MainProject [Windowsアプリケーション]
    SubProject1 [クラスライブラリ]
    SubProject2 [クラスライブラリ]

     

    例えば上記の様な3つのプロジェクトがあるとします。

     

    MainProjectの参照設定に SubProject1 と SubProject2 を追加したときに、MainProjectから参照設定に追加したアセンブリの一覧を取得する方法が分かりませんでした。
    取得は可能なのでしょうか?
    またヒントでも良いので教えていただけると幸いです。

     

    よろしくお願いします。

    2008年3月31日 7:25

回答

  • 外池です。もう一押し、要求を詳細にしてもらえると判りやすくなるのですが、

     

    確認1) デザイン時に参照はされたけれども、結局、プログラムの中では使われていないものは、実行時には取得する必要は無いですよね?(たぶん、無理なのではないかと)

     

    確認2) デザイン時に参照されてプログラムで使われていても、実行時に必要が発生するまではそのアセンブリは読み込まれません。読み込まれる前でも、そのアセンブリの情報が必要ですか?

     

    ----- 追記 -----

     

    AssemblyクラスのGetReferencedAssembliesメソッド・・・、これでOKなような気もしますが・・・。

     

     

    2008年4月1日 1:22

すべての返信

  • それを使って何をしたいのか、というのもありますが。

    mscorlib.dll とかはどうするのか、とか、参照しているアセンブリが更に何か参照している場合はどうするのか、とか、まだロードしていないアセンブリはどうするのか、とか。

    そもそも実行時に取得するのかコーディングやビルド時にどうにかしたいのか。

    2008年3月31日 7:49
  • 済みません。

    説明不足でした。

     

    実行時に参照設定に追加されたアセンブリの型一覧を取得したいです。

    2008年3月31日 8:07
  • 外池です。もう一押し、要求を詳細にしてもらえると判りやすくなるのですが、

     

    確認1) デザイン時に参照はされたけれども、結局、プログラムの中では使われていないものは、実行時には取得する必要は無いですよね?(たぶん、無理なのではないかと)

     

    確認2) デザイン時に参照されてプログラムで使われていても、実行時に必要が発生するまではそのアセンブリは読み込まれません。読み込まれる前でも、そのアセンブリの情報が必要ですか?

     

    ----- 追記 -----

     

    AssemblyクラスのGetReferencedAssembliesメソッド・・・、これでOKなような気もしますが・・・。

     

     

    2008年4月1日 1:22
  • レスありがとうございます。

     

    やっぱり参照設定のみだと読み込まれていないためアセンブリを取得できませんよね。。

     

    動的ロードからアセンブリ内型一覧を作成する方向で試してみます。

    過去に一度それを試したのですがAssembly.Loadだとなぜかエラーになってしまい断念した記憶があります。

     

    GetReferencedAssembliesの情報ありがとうございます。

    Loadがうまくできればそれを使ってやってみたいと思います。

    2008年4月1日 3:05
  • Assembly.GetReferencedAssembliesはLoadしなくても情報が得られます。あるAssemblyが実行時に使うことになるAssemblyが得られるんだと現時点では私は理解しています。ただし、AssemblyNameオブジェクトとして。

     

    で、Assemblyオブジェクトが欲しければ、AssemblyNameを使ってLoadしてやる・・・。

     

    以上のような感じで、おそらく意図されている目的はほとんど達成なんじゃないかと思うのですが。

    2008年4月1日 3:46
  • 詳細な情報ありがとうございました。

     

    現在作成しているプログラムは TreeView コントロールに表示されている名前をクリックすると、その名前に関連づくクラス名のインスタンスを作成しフォームを表示する というものを作っています。

     

    データベースに画面名とクラス名を入れることによりソースを編集しなくても簡単にメニューに追加することが目的でした。

     

    大変参考になる情報をありがとうございました。

    望んでいた動作を実現できそうです。

    2008年4月1日 4:27
  • サンプルコードを作って試してみた結果何とかできるようになりました。

     

    残念ながら Assembly#GetReferencedAssemblies では取得できませんでした。

    出来るようになった方法は Assembly.LoadFrom でDLLを直接読ませればエラーなく読み込むことが出来ました。

     

    大変助かりました。

    ありがとうございました。

    2008年4月2日 2:15