之前,我想借此:检查是否已存在大会通过名字加载它
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