2015-03-21 6 views
1

Мы интегрируемся с сторонним приложением, поставляя файл, который они могут импортировать. Файл содержит много свойств (+100), не все из них являются обязательными, нам нужны только некоторые из них. Тем не менее, приложение продолжает сбой (осторожно, с предупреждением из-за большой попытки уловить) с «объектом, не установленным ссылкой ...» без stacktrace. Поэтому в каком-то месте стороннее приложение не проверяет некоторые необязательные параметры на значениях, вызывающих крах. Поиск того, что свойство ищет иглу в стоге сена..NET Получить все исключения в стороннем приложении

Возможно ли каким-либо образом отслеживать все исключения приложения, у нас нет источника, даже если они пойманы? Таким образом, мы можем получить stacktrace и проверить с Ilspy, какое свойство вызывает проблему.

Стороннее приложение относится к относительно крупной компании. Мы не можем просто общаться со своими разработчиками.

+1

'Мы не можем просто общаться со своими разработчиками.' Это так грустно. Но как разработчик сам .... Yay. –

ответ

3

Вы можете попробовать:

Assembly otherAssembly = typeof(/* a class of the other assembly */).Assembly; 

AppDomain.CurrentDomain.FirstChanceException += (sender, fceea) => 
{ 
    AppDomain domain = (AppDomain)sender; 

    var method = fceea.Exception.TargetSite; 
    var declaringType = method.DeclaringType; 
    var assembly = declaringType.Assembly; 

    if (assembly == otherAssembly) 
    { 
     // Log the stacktrace of the Exception, or whatever 
     // you want 
    } 
}; 

Это позволит вам увидеть все Exception s (даже пойманные). Вы должны поместить этот код туда, где запускается программа (или даже в других местах, это нормально, но старайтесь не выполнять ее несколько раз, потому что это событие широко распространено в AppDomain)

Обратите внимание, что, учитывая, как трассировка стека внутри исключение обрабатывается, возможно, лучше:

if (assembly == otherAssembly) 
{ 
    // Log the stacktrace st of the Exception, or whatever 
    // you want 
    string st = new StackTrace(1, true).ToString(); 
} 

, чтобы вы могли видеть полную трассировку стека.

Теперь, как я уже сказал, вы можете написать небольшое приложение Console app/Winforms, Add Reference для другого exe (да, вы можете добавить ссылку на другой .exe, если это написано на .NET:)), и в вашем Main сделать что-то вроде:

var otherAssembly = typeof(/* Some type from the other assembly */).Assembly; 

// We look all the classes in an assembly for a static Main() that has 
// the "right" signature 
var main = (from x in otherAssembly.GetTypes() 
      from y in x.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) 
      where y.Name == "Main" && (y.ReturnType == typeof(int) || y.ReturnType == typeof(void)) && y.GetGenericArguments().Length == 0 
      let parameters = y.GetParameters() 
      where parameters.Length == 0 || (parameters.Length == 1 && parameters[0].ParameterType == typeof(string[])) 
      select y).Single(); 

if (main.GetParameters().Length == 0) 
{ 
    // static Main() 
    main.Invoke(null, null); 
} 
else 
{ 
    // static Main(string[] args) 

    // Note that new string[0] is the string[] args! 
    // You can pass *your* string[] args :-) 
    // Or build one however you want 
    main.Invoke(null, new object[] { new string[0] }); 
} 

для вызова другого Main(). Прежде чем это сделать, вы должны установить обработчик FirstChanceException.

+0

Любые предложения по введению этого кода? Можете ли вы принудительно загрузить и выполнить метод в dll через config? – MichaelD

+0

@MichaelD Вы помещаете этот метод в 'Main (...)' вашего приложения. Как я уже сказал, это AppDomain широко. – xanatos

+0

Мы не ссылаемся на приложение. Это автономное приложение, которое импортирует файл, который мы его кормим. – MichaelD

Смежные вопросы