在单声道上运行时,如何捕获FilenotFoundException,而DLL丢失了?
-
29-09-2019 - |
题
我有一个带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