Статический конструктор вызывается дважды в одном и том же домене приложения?

Этот вопрос больше о 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 очков репутации. Пожалуйста, создайте его, если у вас есть права. Спасибо.

С уважением, Том

5
задан buckley 20 February 2013 в 14:12
поделиться