8

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

我正在使用以下代码:

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

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

4

4 回答 4

10

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

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;
}
于 2011-02-07T09:35:13.193 回答
2

我认为最好不要试图避免异常。原因是,如果你有类似的代码

if (DoesAssemblyExist(asmName)) {
    object = Activator.CreateInstance(typeName);
}
else {
    MessageBox.Show("Assembly does not exist");
}

在先发制人的多任务操作系统中,总是存在在检查和实际创建之间添加/删除程序集的风险。是的,我意识到这种风险很小,但我仍然认为异常变体看起来更好,因为它是原子的。

于 2011-02-07T10:06:20.650 回答
1

缺少程序集肯定会构成异常,FileNotFoundException请根据您的逻辑尝试/捕获并处理这种情况。

于 2011-02-07T09:33:31.527 回答
-1

我希望它对将来的某人有所帮助:

在您使用的每个外部 .dll 上,创建自己的唯一密钥,如下所示:

字符串键=“fjrj3288skckfktk4owoxkvkfk4o29dic”;

然后,当您加载表单时,对于您拥有的每个外部 .dll,只需检查密钥是否存在,如下所示:

If(isMyLib.Variables.key == key) // 继续

else // .dll 不存在或损坏。

于 2017-03-11T22:13:14.390 回答