在Mono上运行时如何捕获FileNotFoundException并且缺少DLL?

时间:2010-08-18 18:41:55

标签: c# .net dll mono filenotfoundexception

我有一个带有vs2010的windows 7 x64桌面和一个带有mono和monodevelop的linux虚拟盒安装。我使用vs2010编译以下程序并在linux虚拟机中运行它,它失败了,看似无法捕获的FileNotFoundException。如果我在虚拟机中编译它并在Windows中运行它,那就很好。

问题似乎是当无法加载dll时,在Main()之前由mono抛出一个无法捕获的异常。有没有办法重构我的程序或强制单声道,以便我可以捕获此异常?

我正在尝试根据运行时可用的内容编写一个在WPF或GTK中具有接口的程序。

using System;  
#if __MonoCS__  
using Gtk;  
#else  
using System.Windows;  
#endif  
using System.IO;  
using System.Runtime.CompilerServices;  
using System.Collections.Generic;  

namespace Test {

 public static class Program {

  [STAThread]
  public static void Main() {
   try {
    Main2();
   } catch (FileNotFoundException e) {
    Console.WriteLine("Caught FileNotFoundException");
    Console.WriteLine("FileName = {0}", e.FileName);
   }
  }

  [MethodImpl(MethodImplOptions.NoInlining)]
  public static void Main2() {
#if __MonoCS__  
   Application.Init();  
#else  
   Window w = new Window();  
#endif  
  }

 }

}

3 个答案:

答案 0 :(得分:0)

找不到什么DLL?我假设,从你的代码判断,它可能是WinForms。我并不完全熟悉C#预处理器,但我认为#if __MonoCS__可能更有用(或者可能只是作为预处理器定义),也就是说,它不会在运行时更改。您可以尝试在项目设置中为Mono构建定义__MonoCS__并运行它(我认为VS默认情况下不会定义它,因此它可能尝试使用WinForms)。

要尝试的另一件事是评论using System.Windows及其所有相关代码(仅使用GTK / Mono路径)并测试是否在Windows上构建并在两者上运行。如果是这样的话,那么你已经把可能出现的问题缩小到了那个问题,并且应该更容易从那里解决。

答案 1 :(得分:0)

您正在了解JIT编译器的实现细节。它将为丢失的程序集抛出异常的确切时间取决于它将IL转换为机器代码的急切程度。我知道Microsoft抖动是真正及时的,它一次编译一个方法,就在它即将执行之前。虽然这受到是否附加调试器的影响。如果单声道编辑整个班级,你就死在了水中。在Main()可以启动之前,抖动将会抛出。

如果将Main2()放在另一个类中,它可能会更好。最好的办法就是提供一个装配,如有必要,可以使用假人。

答案 2 :(得分:0)

我建议您在不同的程序集中实现特定于平台的GUI,而不是依赖于引用程序集加载的延迟,可能实现了一个通用接口。然后主程序集不会直接引用特定的GUI工具包,但会使用反射来尝试从GAC加载WPF或GTK,并基于此将使用反射来加载特定的GUI DLL程序集并实例化和使用GUI实现

类似的东西:

  • ProgramName.exe - 包含Main入口点IPlatformGui和所有平台共享的逻辑
  • ProgramName.Gtk.dll - 包含GtkGui : IPlatformGui
  • ProgramName.Wpf.dll - 包含WpfGui : IPlatformGui