2009-08-17 14 views
30

Webアプリケーションでは、すべてのアセンブリを/ binディレクトリにロードします。/binディレクトリからすべてのアセンブリをロードする方法

これはファイルシステムのどこにでもインストールできますので、保存先の特定のパスを指定することはできません。

アセンブリアセンブリオブジェクトの一覧<が必要です。

答えて

35

まあ、自分は最初のようなものを使用し、次の方法と一緒にこれをハックすることができます。次に、適切なフィルタを使用してDirectory.GetFilesメソッドを使用して、パス内のすべてのDLLを反復処理します。あなたの最終的なコードは次のようになります。

List<Assembly> allAssemblies = new List<Assembly>(); 
string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 

foreach (string dll in Directory.GetFiles(path, "*.dll")) 
    allAssemblies.Add(Assembly.LoadFile(dll)); 

あなたはDLLが実際に完全なパスが含まれていることを確認します(とそうでない場合は、パスを連結)する必要があるかもしれないので、私はこれをテストしていませんので、予めご了承ください

+2

を、これは古い質問です知っているが... – Wolfwyrd

+8

'path'変数にディレクトリのファイル名が含まれていれば、' Path.GetDirectoryName(path) 'で短縮する必要があります – cjk

+0

それはです。実際に実行しているアセンブリを追加しないようにチェックを追加してください。上記のコメントを反映するように更新されました。 –

4

このようにすることはできますが、アセンブリには有害なコードが含まれている可能性があるため、このように現在のアプリケーションドメインにすべてを読み込まないようにしてください。

public IEnumerable<Assembly> LoadAssemblies() 
{ 
    DirectoryInfo directory = new DirectoryInfo(@"c:\mybinfolder"); 
    FileInfo[] files = directory.GetFiles("*.dll", SearchOption.TopDirectoryOnly); 

    foreach (FileInfo file in files) 
    { 
     // Load the file into the application domain. 
     AssemblyName assemblyName = AssemblyName.GetAssemblyName(file.FullName); 
     Assembly assembly = AppDomain.CurrentDomain.Load(assemblyName); 
     yield return assembly; 
    } 

    yield break; 
} 

編集:私は、コード(このコンピュータでのVisual Studioへのアクセスなし)をテストしていませんが、私はあなたのアイデアを得ることを願っています。あなたの現在のアセンブリへのパスを取得するために

string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 

41

binディレクトリを取得するには、string path = Assembly.GetExecutingAssembly().Location;NOTです(特に、実行中のアセンブリがASP.NETの一時ディレクトリに置かれている場合)。

代わりに、あなたはさらに、あなたはおそらく考慮FileLoadExceptionとBadImageFormatExceptionを取る必要がありますstring binPath = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "bin");

を使用する必要があります。ここで

は私の仕事関数である:

public static void LoadAllBinDirectoryAssemblies() 
{ 
    string binPath = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "bin"); // note: don't use CurrentEntryAssembly or anything like that. 

    foreach (string dll in Directory.GetFiles(binPath, "*.dll", SearchOption.AllDirectories)) 
    { 
    try 
    {      
     Assembly loadedAssembly = Assembly.LoadFile(dll); 
    } 
    catch (FileLoadException loadEx) 
    { } // The Assembly has already been loaded. 
    catch (BadImageFormatException imgEx) 
    { } // If a BadImageFormatException exception is thrown, the file is not an assembly. 

    } // foreach dll 
} 
+8

"bin"ディレクトリは必ずしも配備された.NETアプリケーションに存在するとは限りません。ソリューションはASP.NETでのみ機能することに注意してください。 – BSick7

+0

"bin"ディレクトリの場所はAppDomain.SetupInfomationオブジェクトにあります。そのような使用法: var assemblyliesDir = setup.PrivateBinPathProbe!= null ? setup.PrivateBinPath:setup。ApplicationBase; –

-2

私はおそらくもよいでしょう

System.AppDomain.CurrentDomain.GetAssemblies()

+9

これは、呼び出し側アセンブリ(現在のアセンブリが依存するすべてのアセンブリ)によって参照されるアセンブリのみを返すと考えています。これは必ずしも実行ディレクトリにあるすべてのアセンブリと同じではありません。 http://msdn.microsoft.com/en-us/library/system.appdomain.getassemblies.aspx – Jason

関連する問題