如何从/ bin目录中加载所有程序集

时间:2009-08-17 14:33:49

标签: c# assemblies

在Web应用程序中,我想在/ bin目录中加载所有程序集。

由于这可以安装在文件系统的任何地方,我无法保护存储它的特定路径。

我想要一个List<>装配装配对象。

4 个答案:

答案 0 :(得分:47)

要获取bin目录,string path = Assembly.GetExecutingAssembly().Location; NOT 始终有效(特别是当执行程序集放在ASP.NET临时目录中时)。

相反,您应该使用string binPath = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "bin");

此外,您应该考虑FileLoadException和BadImageFormatException。

这是我的工作职能:

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
}

答案 1 :(得分:44)

嗯,您可以使用以下方法自行解决这个问题,最初使用的方法如下:

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

获取当前程序集的路径。接下来,使用带有合适过滤器的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 :(得分:5)

你可以这样做,但你可能不会像这样将所有内容加载到当前的appdomain中,因为程序集可能包含有害的代码。

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),但我希望你明白这一点。

答案 3 :(得分:-2)

我知道这是一个老问题,但是......

System.AppDomain.CurrentDomain.GetAssemblies()