【问题标题】:Check if Assembly Exists by name before loading it在加载之前检查程序集是否按名称存在
【发布时间】:2017-07-07 02:57:40
【问题描述】:

我想拿这个:

try
{
    Assembly assembly = Assembly.Load("This.Is.My.Assembly.Name");
}
catch (Exception)
{
}

并且做一些类似的事情,但永远不要让它抛出异常。也许做一些返回空值而不是异常的事情,在尝试加载程序集之前检查程序集是否存在。完成此任务的最优雅方法是什么?

【问题讨论】:

  • 为什么要防止异常发生?这听起来像是一个 XY 问题。加载程序集时可能会失败很多;未找到具有所请求名称的文件只是该方法引发异常的原因之一。
  • 最优雅的方式。这就是例外。检查 null 是一种倒退。
  • 在这种情况下,我正在检查程序集中是否存在类以确定是否支持某个功能。所有其他版本也使用相同的逻辑,所以对于 10 个版本,我会得到一个例外。对于一个受支持的版本,它将工作并返回 true。所以这就是为什么我不想获得异常路线。所以更常见的情况会抛出异常,如果可能的话我想避免。
  • 这是一次启动,对吧?就个人而言,我不会担心。但是等一下,你正在检查一个类的存在吗?程序集本身会一直存在吗?
  • 您的观点实际上是有效的。客户端代码只会在此程序集本身始终存在的版本上使用新的逻辑实现。所以我确实走了例外路线。感谢 cmets。

标签: c# .net-assembly


【解决方案1】:

您可以使用 Assembly.ReflectionOnlyLoad 来尝试获取程序集。见http://msdn.microsoft.com/de-de/library/0et80c7k(v=vs.110).aspx。如果找不到程序集并引发异常,但如果找到了程序集,则不会将程序集加载到您的 AppDomain。您可以将其视为“TryLoadAssembly”。 ;)

【讨论】:

    【解决方案2】:

    您可以检查正在执行的程序集是否引用了您的程序集。像这样。

    if (Assembly.GetExecutingAssembly().GetReferencedAssemblies()
                    .FirstOrDefault(c => c.FullName == "This.Is.My.Assembly.Name") == null)
    {
        var assembly = Assembly.Load("This.Is.My.Assembly.Name");
    }
    

    【讨论】:

      【解决方案3】:

      您可以像这样检查程序集:

      bool IsAssemblyExists(string assemblyName)
      {
          foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
          {
             if (assembly.FullName.StartsWith(assemblyName))
                return true;
          }
          return false;
      }
      

      【讨论】:

        猜你喜欢
        • 2022-10-22
        • 2019-03-07
        • 1970-01-01
        • 2015-10-09
        • 1970-01-01
        • 1970-01-01
        • 2022-07-24
        • 2015-12-16
        • 2015-07-11
        相关资源
        最近更新 更多