Вы можете попробовать:
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
.
'Мы не можем просто общаться со своими разработчиками.' Это так грустно. Но как разработчик сам .... Yay. –