0

我注意到在某些情况下,我不分发应用程序所需的特定 dll,应用程序不提供任何错误,它只是不加载(显示在屏幕上)。它的行为就像你还没有开始它。

有谁知道为什么会这样?

编辑:重现步骤:

  1. 使用 WPF 应用项目和类库项目 (ReferenceDll) 创建解决方案。
  2. 将 WPF 应用程序项目中的引用添加到类库项目。
  3. 在类库中,将此方法添加到 Class1

    public int Calculate(int a, int b) { return a + b; }

  4. 将此代码放在 App.OnStartup 中:

    try
    {
        int result = new ReferenceDll.Class1().Calculate(2, 4);
    }
    catch (Exception ex)
    {
        File.WriteAllText(@"D:\Test\error.txt", ex.ToString());
    }
    
  5. 构建解决方案,然后从 bin 文件夹中删除 ReferenceDll。运行应用程序。

不会创建文件,不会显示应用程序。即使您在主视图中移动 Try catch 代码,在某些按钮单击事件中,Catch{} 也永远不会被触发并且它会显示非信息性消息

AppName has stopped working.

并提供调试选项,这对最终用户没有用。

4

2 回答 2

2

如果您没有任何 Trace.WriteLine 语句,那么我建议您添加一些。添加一些到异常处理程序。您也可以使用以下免费工具来捕获跟踪并尝试以这种方式缩小范围。

http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx

您还可以覆盖 app.xaml.cs 中的 Onstartup 方法并从那里实例化您的应用程序并捕获任何异常并输出以进行跟踪。

更新

我已经尝试了您在更新中指出的步骤,并且加载的应用程序没有任何问题。我建议的下一件事是检查您已部署到的环境中的 .net 框架版本。如果您需要帮助,请查看此链接:

http://msdn.microsoft.com/en-us/kb/kbarticle.aspx?id=318785

更新

将您的错误日志记录在一个处理程序中,如该问题的答案中的处理程序,您将看到错误。刚刚用你的例子试过这个,它奏效了。该错误会告诉您确切的问题:

System.IO.FileNotFoundException:无法加载文件或程序集“ReferenceDll,版本=1.0.0.0,Culture=neutral,PublicKeyToken=null”或其依赖项之一。该系统找不到指定的文件。文件名:System.Windows.Application 中 WPFApp.App.OnStartup(StartupEventArgs e) 中的“ReferenceDll,版本=1.0.0.0,Culture=neutral,PublicKeyToken=null”。<.ctor>b__1(未使用对象)在 System.Windows .Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 在 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)

警告:程序集绑定日志记录已关闭。要启用程序集绑定失败日志记录,请将注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) 设置为 1。注意:与程序集绑定失败日志记录相关的一些性能损失。要关闭此功能,请删除注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog

WPF 窗口在启动时崩溃,或者它启动但挂起并且不呈现内容

于 2012-11-27T14:40:04.573 回答
1

当在辅助线程上引发异常时,可能会发生这种情况。请参阅此页面上的备注部分:

独立或浏览器托管的 WPF 应用程序使用 Application 类来检测未处理的异常(请参阅 DispatcherUnhandledException)。但是,Application 只能检测在 Application 类正在运行的同一线程上引发的未处理异常。通常,一个应用程序会有一个主用户界面 (UI) 线程,因此 Application 类的未处理异常检测行为就足够了。但是,主 UI 线程上的 Application 类不会自动检测在辅助线程上引发的未处理异常。

您可以尝试使用此事件来捕获检测异常并记录错误: AppDomain.UnhandledException Event

AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);

static void MyHandler(object sender, UnhandledExceptionEventArgs args) {
   Exception e = (Exception) args.ExceptionObject;
   Console.WriteLine("MyHandler caught : " + e.Message);
}

更新:

除了线程问题之外,如果您将 try...catch 块放在错误的位置,它也可能是原因。考虑这个例子:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        Do();

    }

    private void Do()
    {
        try
        {
            int result = new ClassLibrary1.Class1().Calculate(2, 4);
        }
        catch (System.Exception ex)
        {
            Console.WriteLine("MyHandler caught by try...catch: " + ex.Message);
        }
    }
}

这将导致调用 Do() 的行出现异常,因为此处的 CLR 尝试在此时解析程序集。未捕获异常并且应用程序终止。

但如果你试试这个:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        try
        {
            Do();
        }
        catch (System.Exception ex)
        {
            Console.WriteLine("MyHandler caught by try...catch: " + ex.Message);
        }
    }

    private void Do()
    {
        int result = new ClassLibrary1.Class1().Calculate(2, 4);
    }
}

输出是:

MyHandler 被 try...catch 捕获:无法加载文件或程序集 'ClassLibrary1,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null' 或其依赖项之一。该系统找不到指定的文件。

请注意,当您在引用程序集的同一函数中订阅 UnhandledException 事件时,它不会被触发。这也有效:

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        AppDomain currentDomain = AppDomain.CurrentDomain;
        currentDomain.UnhandledException += new UnhandledExceptionEventHandler(
            (sender, args) =>
            {
                Exception ex = (Exception)args.ExceptionObject;
                Console.WriteLine("MyHandler caught by UnhandledException handler: " + ex.Message);
            });

        Do();
    }

    private void Do()
    {
        int result = new ClassLibrary1.Class1().Calculate(2, 4);
    }

结果:

MyHandler 被 UnhandledException 处理程序捕获:无法加载文件或程序集 'ClassLibrary1,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null' 或其依赖项之一。该系统找不到指定的文件。

希望能帮助到你。

于 2012-11-27T15:24:38.023 回答