C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: クラスライブラリ内のクラスやメソッドの取得方法について


(過去ログ 131 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■77439 / inTopicNo.1)  クラスライブラリ内のクラスやメソッドの取得方法について
  
□投稿者/ Mira (1回)-(2015/10/20(Tue) 13:06:58)

分類:[VB.NET/VB2005 以降] 

2015/10/20(Tue) 13:10:42 編集(投稿者)

いつも参考にさせてもらっています

UNCパス上に動的に配置されるVB.NETで作成されたクラスライブラリ(以下DLL)の中にあるクラスやメソッド一覧を取得しようとしています
メソッドの実行は必要ありません、情報の取得のみです
ただしDLLは当方の管理外にて追加や更新が行われます

現在はUNCパスではなくDLLが配置されているフォルダの上層からコンソールアプリにてSystem.Reflection.Assembly.LoadFileを使用して取得しています

このやり方ですと

・実行中にDLLファイルがロックされる
・DLLが配置されているフォルダの上層のフォルダで起動しなければ読み込めない
・一度読み込んだらプログラムを終了しないとファイルが解放されない

と色々問題をかかえつつ運用しています

そこで質問なのですが

・ファイルをロックせずに情報を取得したいのですが何かよい方法はないでしょうか?
・一時的にロックされてもプログラムを終了しないで解放できるならその方法でもありがたいです
・出来れば実行プログラムの場所の制限がないとうれしいです

環境 Windows7 .Net Framework 2.0又は4.0 VisualStudio2010
引用返信 編集キー/
■77440 / inTopicNo.2)  Re[1]: クラスライブラリ内のクラスやメソッドの取得方法について
□投稿者/ ぽぴ王子 (33回)-(2015/10/20(Tue) 13:14:03)
ぽぴ王子 さんの Web サイト
No77439 (Mira さん) に返信
もしかすると的外れかもしれませんが、対象となる DLL ファイルを何処か違う場所へコピーして
そのコピーした DLL に対してクラスを検索するようにしてみてはどうでしょうか。

> ・実行中にDLLファイルがロックされる

の制約にひっかかってしまうかもしれないので、うまくいかないかもしれないですが。

ファイルを開放する方法については
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=48129&forum=36
こちらが詳しいのではないかと思います。
引用返信 編集キー/
■77441 / inTopicNo.3)  Re[1]: クラスライブラリ内のクラスやメソッドの取得方法について
□投稿者/ Hongliang (360回)-(2015/10/20(Tue) 13:17:42)
File.ReadAllBytesなどでdllのバイナリをByte()として確保して、
Assembly.Load(Byte())
Assembly.ReflectionOnlyLoad(Byte())
のいずれかを使えば良いんではないでしょうか。

// AppDomainを分けないと、変更前dllのロード後に変更後dllをロードしても正しく読めないかも。
引用返信 編集キー/
■77442 / inTopicNo.4)  Re[2]: クラスライブラリ内のクラスやメソッドの取得方法について
□投稿者/ Mira (2回)-(2015/10/20(Tue) 14:39:59)
No77441 (Hongliang さん) に返信

Hongliang様、ぽぴ王子様 回答ありがとうございました

> File.ReadAllBytesなどでdllのバイナリをByte()として確保して、
> Assembly.Load(Byte())
> Assembly.ReflectionOnlyLoad(Byte())
> のいずれかを使えば良いんではないでしょうか。

教えていただいた方法にてファイルをロックすることなくUNCパスから欲しい情報を取得することができました

        For Each FileInfoDll As IO.FileInfo In New IO.DirectoryInfo(PathDll).GetFiles("*.dll")
            Dim BuffDll As Byte() = IO.File.ReadAllBytes(FileInfoDll.FullName)
            Dim AssemblyDll As System.Reflection.Assembly = System.Reflection.Assembly.Load(BuffDll)
            For Each ClassType As Type In AssemblyDll.GetExportedTypes
                For Each Method As System.Reflection.MethodInfo In ClassType.GetMethods
                    Diagnostics.Debug.WriteLine(FileInfoDll.Name + ", " + ClassType.FullName + ", " + Method.Name)
                Next
            Next
        Next

> // AppDomainを分けないと、変更前dllのロード後に変更後dllをロードしても正しく読めないかも。

Dllを読み込んだ後プログラムを終了しないでDllにメソッドを追加し更新後再度読み込んだところ
追加したメソッドを正しく読み取ることができました

とても参考になり助かりました。ありがとうございました

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -