【问题标题】:How to detect if another assembly is available to my application or not如何检测我的应用程序是否可以使用另一个程序集
【发布时间】:2009-05-29 06:44:13
【问题描述】:

我有一个命令行 winforms 可执行文件,它调用 Windows winforms 应用程序。

偶尔Ops在部署应用时忘记在命令行exe中包含windows exe,导致出错。

我如何优雅地处理它并显示一个不错的错误,而不是:

未处理的异常: System.IO.FileNotFoundException:可以 不加载文件或汇编 embly 'MyappFoo, 版本=5.1.4303.0,文化=中性, PublicKeyToken=null' 或其之一 依赖关系。系统找不到 指定的文件。文件名: 'MyAppFoo,版本=5.1.4303.0, 文化=中立,PublicKeyToken=null' 在 AppFoo.Program.Main(String[] args)

警告:程序集绑定日志记录是 关掉。启用程序集绑定 失败记录,设置注册表 值 [HKLM\软件\M icrosoft\Fusion!EnableLog] (DWORD) 到 1. 注意:有一些与程序集绑定相关的性能损失 失败记录。开启此功能 关闭,删除注册表值 [HKLM\软件\微软\福斯 ion!EnableLog]。

编辑:

澄清一下,当

static int Main(string[] args)
{
   try
   {
      Console.WriteLine"MyPhooApp Command Line (c) PhooSoft 2008");
   }
   catch (System.IO.FileNotFoundException fe)
   {
      Console.WriteLine("Unable to find foo.exe");
      return -1;
   }
}

也不写。

【问题讨论】:

    标签: .net exception assemblies


    【解决方案1】:

    您可以使用 .NET 2.0 中引入的仅反射加载功能。这允许您加载程序集以进行检查,而无需将其实际加载到应用程序域中。

    Assembly.ReflectionOnlyLoad

    Assembly.ReflectionOnlyLoadFrom

    【讨论】:

    • 值得注意的是,如果未找到程序集,这些函数仍会抛出 FileNotFound 异常,但您可以准确地知道何时发生。
    • 是的,但另一个优点是,如果您尝试使用正常的程序集加载 API,应用程序将永远不会尝试再次探测程序集。另一个优点是您可以将 ReflectionOnlyLoadFrom 与文件路径一起使用,而不会搞砸绑定上下文。如果您将 Assembly.LoadFrom 与文件路径一起使用,您可能会加载两次相同的程序集。
    • 错误...试图加载相同的程序集两次。我认为,如果融合尝试解析在 loadfrom 上下文中加载的程序集,则会失败。
    【解决方案2】:

    您不能简单地使用 FileInfo.Exists 查找文件吗?

    【讨论】:

    • 不,在调用 Main 方法之前抛出异常。
    猜你喜欢
    • 2023-03-23
    • 2018-08-03
    • 1970-01-01
    • 2019-02-03
    • 2019-07-14
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多