我使用Activator
基于程序集的短名称来实例化一个新类(例如,' CustomModule')。它抛出一个FileNotFoundException
,因为装配不在那里。 有没有办法检查某个程序集名称是否存在?
我使用以下代码:
System.Runtime.Remoting.ObjectHandle obj =
System.Activator.CreateInstance(assemblyName, className);
主要目标是测试组件的存在而不是等待异常发生。
答案 0 :(得分:8)
如果您注意到我对您的问题的评论,很明显我无法确切地确定 您希望或需要如何做到这一点,但在我们有更详细的描述之前我只能为你提供这个,希望它能很好地适应你的情况(关键在于'搜索'组件):
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;
}
答案 1 :(得分:2)
我认为最好不要试图避免异常。原因是,如果您有像
这样的代码if (DoesAssemblyExist(asmName)) {
object = Activator.CreateInstance(typeName);
}
else {
MessageBox.Show("Assembly does not exist");
}
先发制人的多任务操作系统总是存在一种风险,即在检查和实际创建之间可能会添加/删除程序集。是的,我意识到这种风险很小,但我仍然认为异常变体看起来更好,因为它是原子的。
答案 2 :(得分:1)
缺少程序集肯定会构成异常,请尝试/ catch FileNotFoundException
并按照您的逻辑处理这种情况。
答案 3 :(得分:-1)
我希望将来对某人有所帮助:
在您使用的每个外部.dll上,创建自己的uniqe键,如下所示:
string key =" fjrj3288skckfktk4owoxkvkfk4o29dic&#34 ;;
然后,当您加载表单时,对于您拥有的每个外部.dll,只需检查密钥是否存在,如下所示:
if(isMyLib.Variables.key == key) //继续
否则 // .dll不存在或损坏。