Это новая попытка представить версию вопроса, заданного менее успешно сегодня утром.
Рассмотрим следующую программу, которую мы запустим один раз в Visual Studio 2010 и еще раз, дважды щелкнув поисполняемый файл напрямую
namespace ConsoleApplication3
{
delegate void myFoo(int i, string s);
class Program
{
static void Main(string[] args)
{
Foo(1, "hello");
Delegate Food = (myFoo)Foo;
Food.DynamicInvoke(new object[] { 2, null });
}
static void Foo(int i, string s)
{
Console.WriteLine("If the next line triggers an exception, the stack will be unwound up to the .Invoke");
Console.WriteLine("i=" + i + ", s.Length = " + s.Length);
}
}
}
Когда исключение в Foo срабатывает при запуске VS, отладчик правильно отображает стек и показывает, что проблема возникла на второй линии записи в Foo.
Но когда это исключениепроисходит при непосредственном запуске исполняемого файла, из CLR появляется небольшое всплывающее окно, указывающее, что программа вызвала необработанное исключение.Нажмите отладку и выберите отладчик VS.В этом случае стек разматывается до точки самого последнего .DynamicInvoke, и при подключении с помощью отладчика контекст стека, существовавший во время исключения, был частично потерян.
Он существует в ограниченной форме в пределах части «внутреннего исключения» события исключения.Вы нажимаете, чтобы развернуть связанную информацию и найти номер строки, где возникла проблема.Но очевидно, что локальные переменные и другой контекст исчезнут.
Если кто-то попытается сделать то же самое, но без .DynamicInvoke (например, вызвать Foo (1, null) в строке 1 Main), все еще дваждыщелкнув по файлу .exe, мы ДЕЙСТВИТЕЛЬНО получаем правильный номер строки, когда присоединяется отладчик.Точно так же, если приложение запускается нажатием на .exe, но отладчик подключается до того, как генерируется исключение.
Кто-нибудь знает, как приложение, использующее динамическое отражение / вызов, может избежать этой проблемы?В моем предполагаемом случае использования в системе, имя которой я не буду здесь упоминать, я не могу предсказать сигнатуру типа объекта, который будет использоваться в .DynamicInvoke, или даже число аргументов, которые будут использоваться, следовательно,статическая типизация или даже генерики не являются выходом из этого.
Мой вопрос таков: кто-нибудь знает, почему мы получаем такое различное поведение при запуске непосредственно из отладчика по сравнению с подключением к программе после создания исключения?