Этот вопрос больше о C #, чем о log4net (я думаю).
Я создал настраиваемый аппендер и позволил ему читать статическое поле, которое ранее было задано программой.
К моему удивлению, статическое поле было повторно инициализировано, и установленное значение не попало в приложение.
Я запустил debugview и увидел, что статический конструктор вызывается дважды (!). Это не должно быть возможно в том же домене приложения, верно? Только debugview выявил это, поскольку VS не попал во второй раз в точку останова.
Обратите внимание, что это не вопрос отказа от использования статической переменной в log4net. Мне интересно, какую магию использует log4net для этого?
Редактировать №1
Привет, Джон, Большой поклонник.
Я изолировал его, как и просили. Сначала я начал с чистого листа и работал над целевой ситуацией, в которой обнаруживается ошибка. Поскольку я почти соответствовал целевому персонажу по характеру и все еще не воспроизводил реплики, я пошел другим путем.
Начиная с ситуации с ошибкой, я удалил все, что считал несущественным, пока оно не началось ... работало, как ожидалось.
Кажется, что происходит какая-то странная вещь, когда среда выполнения пытается разрешить сборку 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, String moduleLoadMessage, Boolean isUserCode, String name, String version)
И VS не показывает значение для пути на экране отладочного модуля. Как мне удалось попасть в такую ситуацию? Странно, что ему удалось загрузить сборку, но он больше не может сказать, откуда:)
Вот такая изолированная ситуация, когда я модифицирую ее дальше, и она начинает работать, как ожидалось.
https://www.sugarsync.com/pf/D6486369_1701716_00940
Меня все еще интересуют технические детали, но после удаления ссылки на log4net и ее повторного добавления все снова заработало. Я счастлив, что это работает, но меня раздражает, что у меня нет подробного объяснения
Кроме того, статический конструктор * теперь * вызывается дважды, что имеет смысл, поскольку тип снова инициализируется, когда log4net получает его в свои руки. .
Я думаю, что не стоит тратить больше времени на это, потому что я думаю, что решение было в странном состоянии, и понимать, что все это имеет незначительную ценность. Тем не менее, если вы можете придумать что-нибудь, чтобы объяснить это, я был бы рад здесь.
Edit # 2
Оказалось, что некоторые сборки действительно загружались дважды, включая сборку со статическим конструктором. Позже я исследую, как это возможно, но у меня есть обходной путь, отключив и включив Costura. Costura - это задача msbuild, которая объединяет все сборки в одну. Я не говорю, что Костура является первопричиной. Возможно, файлы csproj / sln были в странном состоянии.
Размышляя о том, как в будущем быстрее диагностировать эту проблему, я запустил sysinternals ProcessExplorer. Теперь я ожидал увидеть, что сборки загружаются только один раз, но обнаружил, что они загружаются дважды. Похоже, это ошибка среды выполнения, которая исправлена только в .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-twice
Редактировать № 3 Costura дважды загружала сборки. Проблема была исправлена в тот же день владельцем проекта :) http://code.google.com/p/costura/issues/detail?id=17&thanks=17&ts=1328826304
Нам нужен тег Costura но у меня нет необходимых 1500 очков репутации. Пожалуйста, создайте его, если у вас есть права. Спасибо.
С уважением, Том