在Web应用程序中,我想在/ bin目录中加载所有程序集。
由于这可以安装在文件系统的任何地方,我无法保护存储它的特定路径。
我想要一个List<>装配装配对象。
答案 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()