之前,我想借此:檢查是否已存在大會通過名字加載它
try
{
Assembly assembly = Assembly.Load("This.Is.My.Assembly.Name");
}
catch (Exception)
{
}
,做類似的事情,而是從來沒有拋出異常。也許做一些返回而不是異常的東西,在試圖加載它之前檢查程序集是否存在。什麼是最完美的方式來完成這個?
之前,我想借此:檢查是否已存在大會通過名字加載它
try
{
Assembly assembly = Assembly.Load("This.Is.My.Assembly.Name");
}
catch (Exception)
{
}
,做類似的事情,而是從來沒有拋出異常。也許做一些返回而不是異常的東西,在試圖加載它之前檢查程序集是否存在。什麼是最完美的方式來完成這個?
您可以檢查執行的程序集是否有對程序集的引用。像這樣的東西。
if (Assembly.GetExecutingAssembly().GetReferencedAssemblies()
.FirstOrDefault(c => c.FullName == "This.Is.My.Assembly.Name") == null)
{
var assembly = Assembly.Load("This.Is.My.Assembly.Name");
}
您可以使用Assembly.ReflectionOnlyLoad嘗試獲取組件。見http://msdn.microsoft.com/de-de/library/0et80c7k(v=vs.110).aspx。如果程序集不會被找到並且引發異常,但是如果找到它,程序集就不會被加載到你的AppDomain中。您可以將其視爲「TryLoadAssembly」。 ;)
您可以檢查裝配這樣的:
bool IsAssemblyExists(string assemblyName)
{
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
if (assembly.FullName.StartsWith(assemblyName))
return true;
}
return false;
}
你爲什麼要防止異常發生?這聽起來像是一個XY問題。加載程序集時可能會失敗;沒有找到請求名稱的文件只是該方法拋出異常的一個原因。 – CodeCaster
*是最優雅的方式。這是例外情況。檢查null是向後退步。 – Blorgbeard
在這種情況下,我正在檢查程序集中類的存在以確定是否支持某個功能。所有其他版本也使用這個相同的邏輯,所以對於10個版本,我會得到一個異常。對於一個支持的版本,它將工作並返回true。所以這就是爲什麼我不想獲得例外路線。所以更常見的情況會拋出一個異常,如果可能的話,我想避免這種異常。 – jsirr13