我有一个带VS2010的Windows 7 X64桌面,以及带有单声道和单体开发的Linux的虚拟盒。我使用VS2010编译以下程序并将其运行在Linux虚拟机中,并且似乎无可捕获的FileNotFoundException失败。如果我将其编译在虚拟机中并在Windows中运行,则可以很好地运行。

问题似乎是,当不可能加载DLL时,单声道将单一的异常扔到MAIN()之前。有没有办法重组我的程序或强迫单声道,以便我可以捕获此例外?

我正在尝试编写一个单个程序,该程序根据运行时可用的内容在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  
  }

 }

}
有帮助吗?

解决方案

您正在将自己暴露于JIT - 补偿器的实现细节。它将为缺失的组件提供例外的确切时间取决于它如何将IL转换为机器代码。我知道Microsoft抖动确实是及时的,它一次是在即将执行的之前一次编译一种方法。尽管是否附上了调试器,但这受到影响。如果单声道,您已经死在水中,可以编译整个班级。抖动将在main()开始之前投掷。

如果您将main2()放入另一堂课,也许会更好。最好的办法是只需提供一个组件即可,如有必要。

其他提示

找不到什么DLL?我假设从您的代码来看,这可能是Winforms。我不完全熟悉C#预处理器,但我认为 #if __MonoCS__ 作为预处理器定义,可能更有用(或可能仅起作用),也就是说,在运行时不会改变。您可以尝试定义 __MonoCS__ 对于项目设置中的单声道构建并运行(我认为VS并不能默认情况下定义这一点,因此它可能正在尝试与Winforms一起使用)。

要尝试的另一件事是评论 using System.Windows 以及其所有相关的代码(仅使用GTK/Mono路径),并测试它是否在Windows上构建并在两者上运行。如果是这样,那么您将可能的问题范围缩小到其中包括,并且应该更容易从那里解决。

我建议您在不同的组件中实现特定于平台的GUI,而不是依赖参考装配加载的懒惰,也许可以实现一个共同的界面。然后,主组装将没有直接引用特定的GUI工具包,但是将使用反射尝试从GAC加载WPF或GTK,并基于此反射来加载特定的GUI DLL组件并实例化并使用GUI实现。

就像是:

  • programName.exe-包含 Main 入口点, IPlatformGui, ,以及所有平台共享的逻辑
  • programName.gtk.dll-包含 GtkGui : IPlatformGui
  • programName.wpf.dll-包含 WpfGui : IPlatformGui
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top