Этот вопрос больше о C#, чем о log4net (я думаю).Статический конструктор называется дважды в том же appdomain?
Я создал пользовательский appender и давал ему прочитать статическое поле, которое было установлено ранее программой.
К моему удивлению, статическое поле было повторно инициализировано, а заданное значение не попало в приложение.
Я активировал debugview и увидел, что статический конструктор вызывается дважды (!). Это не должно быть возможным в одном и том же праве на домен? Только debugview довел это до света, так как VS не попал во второй раз на точку останова.
Обратите внимание, что это не вопрос об исключении использования статической переменной с помощью log4net. Меня интересует, какое волшебство использует log4net для достижения этого?
Редактировать # 1
Привет Джон, большой вентилятор.
Я выделил его в соответствии с запросом. Сначала я начал пустым и работал над целевой ситуацией, которая выдает ошибку. Поскольку я почти совпадал с целевым персонажем по характеру и все еще не воспроизводил, я пошел наоборот.
Исходя из ситуации с ошибкой, я удалил все, что я считал несущественным, пока оно не началось ... работая, как ожидалось.
Кажется, есть некоторые странные вещи Höing когда среда выполнения пытается разрешенной сборки log4net (как это наблюдалось в режиме отладки)
Это то, что я вижу с DebugView:
[7756] Обще: WARN - Не удалось проанализировать версию log4net модуля. Исключение: System.NullReferenceException: ссылка на объект не установлена в экземпляр объекта. [7756] в DebuggerShared.Services.EventArgs.ModuleLoadedInDebuggerEventArgs..ctor (String modulePath, String moduleLoadMessage, Boolean isUserCode, String name, String version) [7756] Общие сведения: WARN - Не удалось разобрать версию модуля «FollowUp.Common» модуля. Исключение: System.NullReferenceException: ссылка на объект не установлена в экземпляр объекта. [7756] в DebuggerShared.Services.EventArgs.ModuleLoadedInDebuggerEventArgs..ctor (String ModulePath, Струнный moduleLoadMessage, Boolean isUserCode, имя String, String версия)
И VS не показывает никакого значения для пути в окне отладки модуля. Теперь, как мне удалось прийти к этой ситуации? Странно, что ему удалось загрузить сборку, но больше не могу сказать, откуда :)
Вот изолированная ситуация до такой степени, что если я ее модифицирую дальше, она начнет работать как ожидалось.
https://www.sugarsync.com/pf/D6486369_1701716_00940
Я все еще заинтересован в технических деталях, но после удаления ссылки на Log4Net и добавить его снова все это начало работать снова. Я рад, что он работает, но он меня заманивает, что у меня нет подробного объяснения.
Кроме того, статический конструктор * * вызывается дважды сейчас, что имеет смысл, поскольку тип инициализируется снова, когда log4net получает свои руки в теме.
Я думаю, что не стоит тратить больше времени на это дело. Я думаю, что решение было в странном состоянии, и понять все это имеет предельное значение. Тем не менее, если вы можете придумать что-нибудь, чтобы объяснить это, я был бы рад здесь.
Edit # 2
Оказалось, что некоторые узлы действительно были загружены дважды в том числе и со статическим конструктором. Позже я расскажу, как это возможно, но у меня есть обход, отключив и включив Costura. Costura - это задача msbuild, которая объединяет все сборки в одну. Я не говорю, что Костура является основной причиной. Вполне возможно, что файлы csproj/sln были в странном состоянии.
Думая о том, как быстрее диагностировать эту проблему быстрее, я запускал sysinternals ProcessExplorer. Теперь я ожидал увидеть, что сборки загружаются только один раз, но я обнаружил, что они были загружены дважды. Кажется, это ошибка во время выполнения Thats фиксируется только в .NET 4
http://forum.sysinternals.com/why-some-net-assemblies-are-duplicated-in-memory_topic15279.html https://connect.microsoft.com/VisualStudio/feedback/details/467560/clr-maps-assemblies-into-the-virtual -address-space-two
Редактировать # 3 Costura сделал сборку загружаемой дважды. Вопрос был исправлен в тот же день владельцем проекта :) http://code.google.com/p/costura/issues/detail?id=17&thanks=17&ts=1328826304
Нам нужен тег Costura, но у меня нет необходимых 1500 точек репутации. Создайте его, если у вас есть права. Благодарю.
С наилучшими пожеланиями, Том
«Только debugview довел это до света, так как VS не попал во второй раз на точку останова». <--- Я голосую за ошибку в debugview как более вероятную причину этой проблемы. Мне действительно интересно, что на самом деле произошло там :) – dasblinkenlight
Привет, dasblinkenlight. Debugview - это чистый наблюдатель, я не вижу в нем каких-либо побочных эффектов. Если debug берет трассировку.Writeline дважды означает, что код был выполнен дважды, а debugview не имел к этому никакого отношения. – buckley
Этого не случилось, каменная холодная твердая гарантия. Забыть удалить прослушиватель трассировки по умолчанию является распространенной ошибкой. –