Это дало мне головную боль в течение нескольких месяцев.
Мой код был построен с использованием компилятора 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.