2011-01-01 3 views
2

У меня есть визуальное решение Studio 2010, состоящий из 2-х проектов:Исключение, брошенное в проекте, на который ссылается?

  1. Ядра, С # проект библиотеки классов, который обрабатывает функциональные возможности и данные доступа к
  2. UI, ASP.NET 4 сайта (.NET Framework 4), которая ссылается на Core и вызывает функциональность в Core.

Мой обработчик исключений установлен в Global.asax (Application_Error.) Когда исключение происходит в пользовательском интерфейсе, все работает отлично, я получаю имя файла, номер строки и т.д.

Это не тот случай для исключений, которые происходят в ядре. Для этого я получаю StackTrace как:

{FillUserCount at offset 2376 in file:line:column <filename unknown>:0:0} 

P.S. Core.dll и Core.pdb присутствуют в папке UI Bin. В Visual Studio -> Инструменты -> Параметры -> Отладка -> «Включить только мой код» не отмечена и «Включить поддержку исходного сервера».

Есть ли способ получить информацию о стеке (имя файла, класс, метод, номер строки) также для ошибок, которые произошли в моем проекте с ссылкой?

ответ

3

Решение для этой работы заключалось в создании нового веб-сайта и повторной ссылки на основной проект.

Тем не менее, предпосылки, что упомянутые Джон Скит остаются прежними:

  • проекты должны быть построены в конфигурации отладки, а не Release
  • , а ссылки на проект, убедитесь, что PDB файлы копируются
  • на кодовой стороне, при получении информации об исключении и использовании StackTrace, убедитесь, что вы создали экземпляр со вторым параметром, установленным в true (true, чтобы захватить имя файла, номер строки и номер столбца, в противном случае false .)

Это мой последний рабочий код. Это может помочь другим:

 Exception ex = Server.GetLastError().GetBaseException();  

     StackTrace trace = new StackTrace(ex, true); 
     if (trace.FrameCount == 0) 
      return; 

     StackFrame stackFrame = trace.GetFrame(0); 

     string className, fileName, functionName, message; 
     int line = 0; 

     // if for some reason, filename is being retrieved as null 
     if (stackFrame.GetFileName() == null) 
     { 
      className = ex.TargetSite.ReflectedType.Name; 
      fileName = ex.TargetSite.ReflectedType.Name; 
      functionName = ex.TargetSite.Name; 
      message = ex.Message; 
     } 
     else 
     { 
      // Collect data where exception occured 
      string[] splitFile = stackFrame.GetFileName().Split('\\'); 
      className = splitFile[splitFile.Length - 1]; 
      fileName = stackFrame.GetFileName(); 
      functionName = stackFrame.GetMethod().Name; 
      message = ex.Message; 
      line = stackFrame.GetFileLineNumber(); 
     } 
2

Как вы ссылаетесь на Core? Если вы добавили ссылку на DLL «Release», это объяснило бы это ... если вы только что добавили ссылку на проект , и вы используете сборку с конфигурацией «Отладка», тогда она должна быть в порядке.

+0

На ядре ссылаются ссылки на проект. Оба ядра и интерфейс работают в режиме отладки. После просмотра вашего вопроса я попытался создать ту же структуру, одно решение, с двумя проектами и для вновь созданного, все в порядке. Я сравнивал оба решения бок о бок для любых конфигураций сборки проекта, но все точно так же. Как одно решение (базовое созданное) работает так, как планировалось, а другое еще не отображает имя файла, метод, строку и т. Д.? Должно быть что-то, что мне не хватает. –

+0

@ Даниэль: Хм ... странно. Когда вы говорите «работать в режиме отладки» - вы имеете в виду, что вы строите конфигурацию отладки? Это важный бит. –

+0

Да, я строю как Core, так и UI в конфигурации отладки.Это неправильно? –

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