TypeInitializationException: инициализатор типа для '<Module>' вызвал исключение - PullRequest
7 голосов
/ 31 января 2011

Я много гуглил и отлаживал и не могу понять, что вызывает это исключение.Некогда повторная установка .NET Framework иногда исправляет это, но это выглядит немного отрывочно как исправление:

TypeInitializationException: The type initializer for '&lt;Module&gt;' threw an exception.
    The C++ module failed to load during appdomain initialization.

      The system cannot find the file specified

StackTrace:
   at CModuleInitialize.LoadWpfGfx(CModuleInitialize* )
   at CModuleInitialize.{ctor}(CModuleInitialize* )
   at ?A0x828d0bb1.??__E?A0x828d0bb1@cmiStartupRunner@@YMXXZ()
   at _initterm_m((fnptr)* pfbegin, (fnptr)* pfend)
   at &lt;CrtImplementationDetails&gt;.LanguageSupport.InitializePerAppDomain(LanguageSupport* )
   at &lt;CrtImplementationDetails&gt;.LanguageSupport._Initialize(LanguageSupport* )
   at &lt;CrtImplementationDetails&gt;.LanguageSupport.Initialize(LanguageSupport* )

Любые подсказки?

Контекст

Это приложение WinForms, написанное на C # с несколькими новыми компонентами, написанными на WPF.Отчеты о сбоях, которые мы получаем, не включают больше контекста, чем то, что я показываю (трассировка стека и т. Д.), И мы не делаем никакого C ++, управляемого или иного.

Я неудалось воспроизвести этот сбой, но удаленная диагностика нескольких клиентов предполагает, что переустановка .NET Framework может решить эту проблему для этого клиента.

Клиенты, сообщившие об этом сбое, делают этонесколько раз, и кажется, что они не могут использовать приложение, пока не будет переустановлена ​​.NET Framework, или они вернутся к более старой версии приложения, которая использовала только .NET 2.0

Ссылки

Некоторые ссылки указывают на возможную связь между бета-версиями .NET Framework или Visual Studio и этот сбой, но в данном случае это маловероятно.

Другое возможное соединение может быть с распространяемым Visual C ++ 2005.

Ответы [ 4 ]

10 голосов
/ 31 января 2011

Вы смотрите на внутренности PresentationCore, кода, написанного на C ++ / CLI.Имя <Module> - это имя класса для всех глобальных функций C ++ / CLI.Бомба рано, сразу после загрузки сборки произошел сбой инициализатора модуля.Точная работа, выполненная LoadWpfGfx (), не документирована нигде, которую я знаю, но легко догадаться.Он загружает неуправляемую библиотеку DLL, которая реализует графический интерфейс, возможно, уровень интерфейса DirectX.

Это специфическая проблема компьютера.Функция проверяет реестр на наличие нужной DLL для загрузки, затем использует LoadLibrary () для ее загрузки.Очевидно, что DLL отсутствует.Вашему клиенту необходимо снова установить стабильность своей машины, а затем переустановить .NET.Если у них все еще есть проблемы, они могут использовать инструмент ProcMon от SysInternals, чтобы увидеть, какие ключи реестра и какая DLL ищутся.

3 голосов
/ 21 апреля 2015

Это дало мне головную боль в течение нескольких месяцев. Мой код был построен с использованием компилятора Oxygene Pascal, полностью интегрированного с VS 2012. Исключение TypeInitializationException возникает, когда ..cctor не выполняет свою работу каким-либо образом.

Что я сделал, чтобы выяснить, почему мой код lib класса C # работает и мой код lib класса Oxygene постоянно дает сбой при обращении к веб-службе веб-сайта WCF в IIS 7.5 на удаленном хосте, но ОБА отлично работает на локальном масштаб, отлично работал при проведении модульного тестирования VS 2012.

ОК, это библиотека классов 1. Я написал библиотеку классов в CS ToolboxCS.cs 2. Я написал ту же библиотеку классов в Oxygene ToolboxPAS.pas 3. Один ToolboxCS работает удаленно, а ToolboxPAS дает сбой удаленно 4. давайте посмотрим на два кода 4а)

using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
namespace ToolboxCS
{
    [CompilerGenerated]
    [StructLayout(LayoutKind.Auto, CharSet = CharSet.Auto)]
    public static class __Global
    {
        public static string Stop_Time = "1949.Mar.19";
    }
}

4б) Образец кислорода

namespace ToolboxPAS;
interface
uses
  System;
VAR
  Stop_Time: String := "1949.Mar.19";
implementation
end.

Затем я взял ILSpy.exe, чтобы посмотреть на сгенерированный код, и обнаружил, что код дизассемблирования для CS такой же. Но, взглянув на ILSPy.exe на информацию о сборке двух примеров, я увидел много различий, некоторые из них не имели никакого эффекта, но показанный ниже был убийцей для моего класса Oxygene ToolboxPAS.pas lib, когда он должен работать на IIS 7.5 -> w3wp.exe -> xyxyxyxyxy.dll -> ToolboxPAS.dll

{$IFDEF DEBUG}
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default or 
DebuggableAttribute.DebuggingModes.DisableOptimizations or 
DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints or 
DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
{$ENDIF}

Другими словами, если вы выполните отладочную сборку, ваш код cs не покажет сборку с этими атрибутами в файле информации о сборке. Но вы увидите, что эти атрибуты сгенерированы и использованы при просмотре с ILSpy.exe в сгенерированную DLL.

И после того, как я добавил эти атрибуты в свой файл сведений о сборке ToolboxPAS.pas (как показано выше) для отладочной сборки, он больше не вызывал исключение InitializationException при вызове для доступа только к простой переменной в нем.

Поскольку я изменил это во всех информационных файлах сборки для моих больших библиотек классов DLL (12 DLL), они запускаются как снифф при развертывании на удаленном веб-сервере IIS 7.5 в качестве веб-службы wen-сайта WCF.

0 голосов
/ 06 апреля 2017

Для меня ошибка произошла, когда у меня была статическая переменная внутри класса, которая инициализируется с использованием значения из файла конфигурации.

В файле конфигурации не было значения, что вызвало исключение во время инициализации класса.

0 голосов
/ 04 апреля 2014

У меня было то же сообщение об ошибке.Компонент, который я использовал, требовал .net Framework 3.0, но мое приложение предназначалось для 2.0.Пользователи, которые установили 3.0 на своих компьютерах, не испытывали проблем с запуском моего приложения, но те, кто не смог его запустить, не могли.

Не проблема, которую многие ожидают, но это возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...