2011-02-07 90 views
8

我使用Activator基於程序集的短名稱(例如'CustomModule')實例化新類。它會拋出FileNotFoundException,因爲程序集不在那裏。 有沒有辦法檢查某個程序集名稱是否存在?如何檢查某個組件是否存在?

我使用以下代碼:

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

的主要目的是要相當測試組件不是等待發生異常的存在。

+0

你的意思是加載到當前的應用程序域?什麼是`assemblyName`?完全合格的程序集名稱或物理文件路徑? – 2011-02-07 09:28:44

+0

@MrDisaapointment我知道的唯一事情是我的數據庫中有一個「CustomModule」。如果CustomModule.dll存在於我的bin或GAC(!?)中,而不是生成由classname指定的類。 – 2011-02-07 09:41:52

+0

看到我的最新更新,希望這足以繼續。 – 2011-02-07 10:08:32

回答

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

缺少程序集絕對構成一個異常,嘗試/趕上FileNotFoundException並根據您的邏輯處理情況。

2

我認爲這是最好不要嘗試,以免例外。原因是,如果你有一個像

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

代碼總是有一個搶先式多任務操作系統,可能會增加組裝/檢查和實際創作之間取出的風險。是的,我意識到這種風險很小,但我仍然認爲異常變體看起來更好,因爲它是原子性的。

-1

我希望這將幫助別人的未來:

您所使用的每個外部.dll文件,創建自己的潮頭的關鍵,就像這樣:

字符串鍵=「fjrj3288skckfktk4owoxkvkfk4o29dic」;

然後,當你加載你的形式,你已經得到了每一個外部.dll文件,只需檢查重點是存在的,像這樣:

如果(isMyLib.Variables.key ==鍵) // continue

else // .dll不存在或損壞。

相關問題