Как я могу получить полезную ошибочную информацию.NET WPF от машины пользователя?

У меня есть приложение WPF, которое это разрушает, после того как я получаю его на машины, которым не установили среду разработки - если это - простофиля, мне рады в закрытии, но мне, моему поиску-fu не удается найти эквивалентный вопрос. Кажется, что я получаю XamlParseException, но ничто более полезное, чем это. Я должен получить полезную информацию.

Прохождение через журналов событий Windows 7 дает мне этот журнал ошибок:

Fault bucket , type 0
Event Name: CLR20r3
Response: Not available
Cab Id: 0

Problem signature:
P1: MyApp.exe
P2: 1.0.0.0
P3: 4b88323d
P4: PresentationFramework
P5: 3.0.0.0
P6: 4a174fbc
P7: 624f
P8: e1
P9: System.Windows.Markup.XamlParse
P10: 

Attached files:
C:\Users\Mark\AppData\Local\Temp\WER7DC.tmp.WERInternalMetadata.xml

These files may be available here:
C:\Users\Mark\AppData\Local\Microsoft\Windows\WER\ReportArchive
 \AppCrash_generatortestbed_4fa7dff09a9e893eb675f488392571ced4ac8_04ef1100

Analysis symbol: 
Rechecking for solution: 0
Report Id: cd55060c-271f-11df-b6ff-001e52eefb8e
Report Status: 1

Я проверил те каталоги, и первое не существует, в то время как второе содержит wer файл, который просто перечисляет загруженный dlls.

Я мог установить среду разработки на своей тестовой машине, но затем ей не удается быть тестовой машиной, и я возвращаюсь к начальной ситуации. Я не получаю эту ошибку с dev установленной средой, таким образом, я в замешательстве о том, как получить подробное, полезное сообщение об ошибке.

Править: при создании прочь из комментария @Alastair Pitts ниже, вот то, как я заполнил обработку исключений:

    private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) {
        Exception theException = e.Exception;
        string theErrorPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\GeneratorTestbedError.txt";
        using (System.IO.TextWriter theTextWriter = new System.IO.StreamWriter(theErrorPath, true)){
            DateTime theNow = DateTime.Now;
            theTextWriter.WriteLine("The error time: " + theNow.ToShortDateString() + " " + theNow.ToShortTimeString());
            while (theException != null) {
                theTextWriter.WriteLine("Exception: " + theException.ToString());
                theException = theException.InnerException;
            }
        }
        MessageBox.Show("The program crashed.  A stack trace can be found at:\n" + theErrorPath);
        e.Handled = true;
        Application.Current.Shutdown();
    }

Хотелось бы надеяться, я получу то, что мне нужен этот путь. Спасибо за справку!

15
задан mmr 4 March 2010 в 15:30
поделиться

2 ответа

Я бы использовал процедуру для обработки события UnhandledException в домене приложения.

Как только вы это сделаете, у вас будет несколько вариантов. Запись исключения в файл, его сериализация для последующей проверки, отображение диалогового окна с сообщением об исключении.

РЕДАКТИРОВАТЬ: XamlParseException возникают при создании вашего главного окна. Это означает, что вызывается конструктор этого окна. Если вы выполните любую логику в этом конструкторе, любые возникающие исключения вызовут исключение XamlParseException . Насколько я понимаю, обработчик UnhandledException все равно перехватит это исключение.

Чтобы подключить событие UnhandledException в WPF, добавьте подключение к событию в свой app.xaml

<Application 
   x:Class="DispatcherUnhandledExceptionSample.App"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   StartupUri="MainWindow.xaml"     
   DispatcherUnhandledException="App_DispatcherUnhandledException" />

, которое затем добавит метод в ваш app.cs

public partial class App : Application
{
    void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
    {
        // Process unhandled exception do stuff below

        // Prevent default unhandled exception processing
        e.Handled = true;
    }
}

MSDN

15
ответ дан 1 December 2019 в 04:00
поделиться

Ведение журнала исключений (как в ответе Аластера Питтса) поможет определить источник ошибки.

Наличие XamlParse в строке P9 предполагает, что может быть проблема с инициализацией элемента управления или окна из описания XAML. Может существовать сборка, на которую ссылается XAML, которая не была найдена на целевом компьютере или не соответствовала подписи в XAML.

Изменить:

Разбор XAML происходит в InitializeComponent (), который вызывается в конструкторе окна или элемента управления

1
ответ дан 1 December 2019 в 04:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: