c# - 如何检查某个程序集是否存在?

标签 c# reflection assemblies c#-2.0 activator

我正在使用 Activator 根据程序集的简称(例如“CustomModule”)实例化一个新类。它抛出 FileNotFoundException,因为程序集不存在。 有没有办法检查某个程序集名称是否存在?

我正在使用以下代码:

System.Runtime.Remoting.ObjectHandle obj = 
    System.Activator.CreateInstance(assemblyName, className);

主要目标是测试程序集是否存在,而不是等待异常发生。

最佳答案

如果您注意到我对您的问题的评论,那么很明显我不能完全确定您希望或需要如何处理此问题,但在我们有更详细的描述之前我只能向您提供这个,希望它适合您的情况(关键在于“搜索”程序集):

var className = "System.Boolean";
var assemblyName = "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
var assembly = (from a in assemblies
                where a.FullName == assemblyName
                select a).SingleOrDefault();
if (assembly != null)
{
    System.Runtime.Remoting.ObjectHandle obj = 
        System.Activator.CreateInstance(assemblyName, className);             
}

.NET 2.0 兼容代码

Assembly assembly = null;
var className = "System.Boolean";
var assemblyName = "mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";

foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
{
    if (a.FullName == assemblyName)
    {
        assembly = a;
        break;
    }
}

if (assembly != null)
{
    System.Runtime.Remoting.ObjectHandle obj =
        System.Activator.CreateInstance(assemblyName, className);
}

如果你想在尝试加载文件之前确定文件是否存在(一个好的做法),那么,如果你有它的名称并知道所需的位置,只需在解析程序集时尝试找到该文件:

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

var className = "StackOverflowLib.Class1";
var assemblyName = "StackOverflowLib.dll";
var currentAssemblyPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var obj = Activator.CreateInstance(Path.Combine(currentAssemblyPath, assemblyName), className);

static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    var currentAssemblyPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
    if (File.Exists(Path.Combine(currentAssemblyPath, args.Name)))
    {
        return Assembly.LoadFile(Path.Combine(currentAssemblyPath, args.Name));
    }
    return null;
}

关于c# - 如何检查某个程序集是否存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4919574/

相关文章:

c# - 从通用接口(interface)继承

c# 6.0 和反射,获取 Property Initializers 的值

c# - 使用反射将项目添加到 List<T>

c# - 从 GAC 或其他地方浏览/选择程序集

c# - C#数据库查询错误消息?

c# - 带有鉴别器问题的 MongoDB 反序列化

C# - Winforms - 全局变量

c# - 插件架构中的反射与属性

.net - 在 .NET Compact Framework 中获取程序集的版本而不加载它

.net-4.0 - 无法在 MonoDevelop 2.4.1 中添加 .NET 4.0 程序集引用