Mein Standard-Haftungsausschluss: Ich bin ein Entwickler für dieses Produkt.
Mit einem Produkt (Runtime Intelligence), das von dem Unternehmen entwickelt wurde, für das ich arbeite (PreEmptive Soltutions), können Sie nicht nur Fehlerberichte einfügen, sondern auch die Möglichkeit, zu verfolgen, wann Benutzer Ihre Anwendungen verwenden und welche Funktionen sie nutzen, und das mit minimalem Programmieraufwand.
Mithilfe von Dotfuscator zur Code-Injektion (oder IL Weaving) fügen wir neuen Code in Ihre Anwendungs-Binärdateien ein, der Nutzungsdaten an einen bei uns gehosteten Server (oder optional an eine beliebige URL) zurücksendet. Wenn Sie die Daten an uns senden, stellen wir Ihnen eine Reihe leistungsfähiger Analysetools und Berichte über die Nutzung zur Verfügung.
Eine Basisversion dieser Funktionalität soll in Visual Studio 2010 enthalten sein, ebenso wie der Zugang zu einem kostenlosen Portal für die Datenberichterstattung (allerdings ohne SLAs, Datenaufbewahrungsgarantien oder Datenschutz).
Die Möglichkeit, beliebige Daten zusammen mit den Nutzungsinformationen zurückzusenden, ist auf das kommerzielle Produkt beschränkt, aber Sie können PreEmptive Soltutions kontaktieren, um eine voll funktionsfähige, zeitlich begrenzte Testversion zu erhalten.
Sie können die Fehlerberichterstattung mit dem unten stehenden Beispielcode durchführen:
public partial class app : Application {
// field to temporarily store exception data
private Exception exp;
void AppStartup(object sender, StartupEventArgs args) {
// add a handler to catch any unhandled exceptions
this.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(ErrorHandler);
Window1 mainWindow = new Window1();
mainWindow.ShowDialog();
}
// this will prompt the user if they want to report the exception
void ErrorHandler(object sender, DispatcherUnhandledExceptionEventArgs e) {
this.exp = e.Exception;
if (MessageBox.Show("A " + exp.Message + " exception happened, should I report it?", "Error Occurrend", MessageBoxButton.YesNo) == MessageBoxResult.Yes) {
ErrorHappened();
e.Handled = true;
}
}
// this method is called by the above ErrorHandler method and when run through Dotfuscator additional code will be injected into this method that will send a usage data message back to the server and the data in the dictionary (which will be exception data) returned by the ErrorData method will be included into the message and be stored and reported on the server
[Feature("Exception", EventType = FeatureEventTypes.Tick, ExtendedKeySourceElement = SourceElements.Method, ExtendedKeySourceName = "ErrorData")]
private void ErrorHappened() {
// This is here as a placeholder for the exception feature attribute which will exit the application when executed
AppShutdown(true);
}
// this method takes the exception data from the exp field and returns it as a dictionary of name/value pairs
public Dictionary<string, string> ErrorData() {
var retval = new Dictionary<string,string>();
if (null != exp) {
retval.Add("Error Message",exp.Message);
retval.Add("Stack Trace",exp.StackTrace);
}
return retval;
}
}