我有一个带有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
}
}
}
答案 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实现
类似的东西:
Main
入口点IPlatformGui
和所有平台共享的逻辑GtkGui : IPlatformGui
WpfGui : IPlatformGui