2009-07-21 3 views
10

ビンディレクトリにあることがわかっているライブラリの "Foo.dll"のようなファイル名があります。私はそれのためのアセンブリオブジェクトを作成したいと思います。私はページではないクラスからこのオブジェクトをインスタンス化しようとしているので、パスを取得するためのRequestオブジェクトを持っていません。 Assembly.Load()の使用に必要なパスを取得するにはどうすればよいですか?ASP.NETのビンからアセンブリをロード

答えて

15

Assembly.Loadにはファイルパスが必要ではなく、AssemblyNameが必要です。アセンブリが標準の検索パス(binディレクトリ)にあることがわかっている場合、アセンブリのディスクパスを知る必要はありません。そのアセンブリ名を知る必要があります。あなたのアセンブリの場合は、あなたが特定のバージョン、文化などを必要としないと仮定すると、アセンブリ名は、単に「フー」でなければなりません:

Assembly fooAssembly = Assembly.Load("Foo"); 

あなたが特定のバージョンをロードする必要がない場合は、

Assembly fooAssembly = Assembly.Load("Foo, Version=1.1.2, Culture=neutral"); 

は一般的に、あなたはAssembly.Loadはなく、Assembly.LoadFromまたはAssembly.LoadFileを使用したい:次の操作を行います。 LoadFromとLoadFileは標準フュージョンプロセスの外で動作し、複数回ロードされたアセンブリ、安全でない場所からロードされたアセンブリなどにつながります。Assembly.Loadは、標準的なロードを実行し、bin、GAC標準のセキュリティチェックをすべて適用します。

+2

代わりに、すでにそのアセンブリに型のオブジェクトがある場合は、 のようにすることができます:obj.GetType()。Assembly –

2

Assembly.LoadFile(...)は機能しますか?

+0

絶対パスがわかっているかどうか確かめてください。私はそれが質問の重要な部分だと思います。 –

1

あなたの説明から、これはWebアプリケーションのように聞こえるので、要求から生成した非同期スレッドでなければ、まだHttpContextにアクセスする必要があります。そこから、必要なファイルにServer.MapPath()を使用することができます。

0

私が使用している完全な例です。

[TestMethod()] 
public void ReadAssemblyResourceFileTest() 
{ 
    var res = SetupEngine.ReadAssemblyResourceFile("newdb.sql"); 
    Assert.IsNotNull(res); 
} 

PS:リソースは、DLLライブラリ(議会)のルートの下のフォルダ

 public static string ReadAssemblyResourceFile(string resourcefilename) 
     { 
using (var stream = Assembly.Load("GM.B2U.DAL").GetManifestResourceStream("GM.B2U.DAL.Resources." 
    + resourcefilename))   { 
        if (stream == null) throw new MyExceptionDoNotLog($"GM.B2U.DAL.Resources.{resourcefilename} not found in the Assembly GM.B2U.DAL.dll !"); 
        using (var reader = new StreamReader(stream)) 
        { 
         return reader.ReadToEnd(); 
        }   
       } 
     } 

関数を呼び出すためです。各リソースファイルの "ビルドアクション"を "埋め込みリソース"(プロパティウィンドウ内)としてマークすることを忘れないでください。

関連する問題