修复System.TypeInitializationException错误是什么以及如何修复?

private static void Main(string[] args) { string str = null; Logger.InitUserLogWithRotation(); // <--- error occur ... } 

当我构建项目时,它没有错误。 但是当我执行它时,它总是中止。

我试图调试项目,但第一行发生了System.TypeInitializationException错误。

我已经尝试过谷歌搜索,但没有找到解决方案。

似乎任何变量初始化代码都是错误的,但找不到它。

请帮我。 我是C#的新手。

谢谢。

※这是记录器类代码

 public class Logger { private static int HDLOG_PRIORITY_DEBUG = 4; private static int HDLOG_PRIORITY_ERROR = 1; private static int HDLOG_PRIORITY_FATAL = 0; private static int HDLOG_PRIORITY_INFO = 3; private static int HDLOG_PRIORITY_WARNING = 2; public static int LOG_LEVEL_DEBUG = 4; public static int LOG_LEVEL_ERROR = 2; public static int LOG_LEVEL_FATAL = 1; public static int LOG_LEVEL_INFO = 5; public static int LOG_LEVEL_WARNING = 3; private static string s_bstCommonAppData = Path.Combine(s_commonAppData, "XXXX"); private static string s_bstUserDataDir = Path.Combine(s_bstCommonAppData, "UserData"); private static string s_commonAppData = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); private static bool s_consoleLogging = false; private static FileStream s_fileStream; public static HdLoggerCallback s_HdLoggerCallback; private static string s_logDir = null; private static string s_logFileName = "XXXX"; private static string s_logFilePath = null; public static int s_logFileSize = 0xa00000; private static bool s_loggerInited = false; private static string s_logLevels = null; private static int s_logRotationTime = 0x7530; private static string s_logStringDebug = "DEBUG"; private static string s_logStringError = "ERROR"; private static string s_logStringFatal = "FATAL"; private static string s_logStringInfo = "INFO"; private static string s_logStringWarning = "WARNING"; private static int s_processId = -1; private static string s_processName = "Unknown"; private static object s_sync = new object(); public static int s_totalLogFileNum = 5; private static TextWriter writer = Console.Error; private static void Close() { if (!s_consoleLogging) { writer.Close(); s_fileStream.Dispose(); writer.Dispose(); } } public static void Debug(string msg) { Debug("{0}", new object[] { msg }); } public static void Debug(string fmt, params object[] args) { Print(LOG_LEVEL_DEBUG, s_processName, fmt, args); } private static void DoLogRotation() { Label_0000: Thread.Sleep(s_logRotationTime); try { lock (s_sync) { FileInfo info = new FileInfo(s_logFilePath); if (info.Length >= s_logFileSize) { string destFileName = s_logFilePath + ".1"; string path = s_logFilePath + "." + s_totalLogFileNum; if (File.Exists(path)) { File.Delete(path); } for (int i = s_totalLogFileNum - 1; i >= 1; i--) { string str3 = s_logFilePath + "." + i; string str4 = s_logFilePath + "." + (i + 1); if (File.Exists(str3)) { File.Move(str3, str4); } } File.Move(s_logFilePath, destFileName); } } goto Label_0000; } catch (Exception) { goto Label_0000; } } public static void Error(string msg) { Error("{0}", new object[] { msg }); } public static void Error(string fmt, params object[] args) { Print(LOG_LEVEL_ERROR, s_processName, fmt, args); } public static void Fatal(string msg) { Fatal("{0}", new object[] { msg }); } public static void Fatal(string fmt, params object[] args) { Print(LOG_LEVEL_FATAL, s_processName, fmt, args); } private static string GetLogDir(bool userSpecificLog) { string str; if (s_logDir != null) { return s_logDir; } try { if (userSpecificLog) { str = Path.Combine(s_bstUserDataDir, "Logs"); } else { str = (string) Registry.LocalMachine.OpenSubKey(@"Software\XXXX").GetValue("LogDir"); } } catch (Exception) { str = Path.Combine(s_bstUserDataDir, "Logs"); } s_logDir = str; return str; } private static string GetPrefix(string tag, string logLevel) { int managedThreadId = Thread.CurrentThread.ManagedThreadId; DateTime now = DateTime.Now; return string.Format("{0:D4}-{1:D2}-{2:D2} {3:D2}:{4:D2}:{5:D2}.{6:D3} {7}:{8:X8} ({9}). {10}: ", new object[] { now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, now.Millisecond, s_processId, managedThreadId, tag, logLevel }); } public static TextWriter GetWriter() { return new Writer(delegate (string msg) { Print(msg); }); } private static void HdLogger(int prio, uint tid, string tag, string msg) { int level = 0; if (prio == HDLOG_PRIORITY_FATAL) { level = LOG_LEVEL_FATAL; } else if (prio == HDLOG_PRIORITY_ERROR) { level = LOG_LEVEL_ERROR; } else if (prio == HDLOG_PRIORITY_WARNING) { level = LOG_LEVEL_WARNING; } else if (prio == HDLOG_PRIORITY_INFO) { level = LOG_LEVEL_INFO; } else if (prio == HDLOG_PRIORITY_DEBUG) { level = LOG_LEVEL_DEBUG; } Print(level, tag, "{0:X8}: {1}", new object[] { tid, msg }); } public static void Info(string msg) { Info("{0}", new object[] { msg }); } public static void Info(string fmt, params object[] args) { Print(LOG_LEVEL_INFO, s_processName, fmt, args); } public static void InitConsoleLog() { InitLog("-", true, false); } public static void InitLog(string logFileName, bool userSpecificLog, bool doLogRotation) { s_loggerInited = true; s_HdLoggerCallback = new HdLoggerCallback(Logger.HdLogger); s_processId = Process.GetCurrentProcess().Id; s_processName = Process.GetCurrentProcess().ProcessName; if (logFileName == "-") { writer = Console.Error; s_consoleLogging = true; } else { if (logFileName == null) { logFileName = s_logFileName; } if (userSpecificLog) { logFileName = logFileName + "Users"; } string logDir = GetLogDir(userSpecificLog); string str2 = string.Format(@"{0}\{1}.log", logDir, logFileName); if (!Directory.Exists(logDir)) { Directory.CreateDirectory(logDir); } s_logFilePath = str2; LogLevelsInit(); lock (s_sync) { Open(); } if (doLogRotation) { new Thread(() => DoLogRotation()) { IsBackground = true }.Start(); } } } public static void InitSystemLog() { InitLog(null, false, false); } public static void InitSystemLogWithRotation() { InitLog(null, false, true); } public static void InitUserLog() { InitLog(null, true, false); } public static void InitUserLogWithRotation() { InitLog(null, true, true); } private static bool IsLogLevelEnabled(string tag, string level) { if (s_logLevels == null) { return false; } return (s_logLevels.StartsWith("ALL") || s_logLevels.Contains((tag + ":" + level).ToUpper())); } private static void LogLevelsInit() { string name = @"Software\XXXX\Config"; try { using (RegistryKey key = Registry.LocalMachine.OpenSubKey(name)) { s_logLevels = (string) key.GetValue("DebugLogs"); } } catch (Exception) { return; } if (s_logLevels != null) { s_logLevels = s_logLevels.ToUpper(); } } private static void Open() { if (!s_consoleLogging) { if (!s_loggerInited) { InitLog("-", false, false); s_loggerInited = true; } else { s_fileStream = new FileStream(s_logFilePath, FileMode.Append, FileAccess.Write, FileShare.Delete | FileShare.ReadWrite); writer = new StreamWriter(s_fileStream, Encoding.UTF8); } } } public static void Print(string msg) { Print("{0}", new object[] { msg }); } public static void Print(string fmt, params object[] args) { Print(LOG_LEVEL_INFO, s_processName, fmt, args); } public static void Print(int level, string tag, string fmt, params object[] args) { string str = "UNKNOWN"; if (level == LOG_LEVEL_FATAL) { str = s_logStringFatal; } else if (level == LOG_LEVEL_ERROR) { str = s_logStringError; } else if (level == LOG_LEVEL_WARNING) { str = s_logStringWarning; } else if (level == LOG_LEVEL_INFO) { str = s_logStringInfo; } else if (level == LOG_LEVEL_DEBUG) { str = s_logStringDebug; } if ((level != LOG_LEVEL_DEBUG) || IsLogLevelEnabled(tag, str)) { lock (s_sync) { Open(); writer.WriteLine(GetPrefix(tag, str) + fmt, args); writer.Flush(); Close(); } } } public static void SetLogDir(string logDir) { s_logDir = logDir; } public static void Warning(string msg) { Warning("{0}", new object[] { msg }); } public static void Warning(string fmt, params object[] args) { Print(LOG_LEVEL_WARNING, s_processName, fmt, args); } public delegate void HdLoggerCallback(int prio, uint tid, string tag, string msg); public class Writer : TextWriter { private WriteFunc writeFunc; public Writer(WriteFunc writeFunc) { this.writeFunc = writeFunc; } public override void WriteLine(string msg) { this.writeFunc(msg); } public override void WriteLine(string fmt, object obj) { this.writeFunc(string.Format(fmt, obj)); } public override void WriteLine(string fmt, object[] objs) { this.writeFunc(string.Format(fmt, objs)); } public override System.Text.Encoding Encoding { get { return System.Text.Encoding.UTF8; } } public delegate void WriteFunc(string msg); } } 

每当抛出TypeInitializationException时,在抛出exception的语句中第一次检查所引用类型的所有初始化逻辑 – 在您的情况下: Logger

初始化逻辑包括:类型的静态构造函数(如果我没有错过它 – 你没有 Logger )和字段初始化。

除了以下行之外,字段初始化在Logger几乎是“不加批判的”:

 private static string s_bstCommonAppData = Path.Combine(s_commonAppData, "XXXX"); private static string s_bstUserDataDir = Path.Combine(s_bstCommonAppData, "UserData"); private static string s_commonAppData = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 

s_commonAppDataPath.Combine(s_commonAppData, "XXXX");的位置为null Path.Combine(s_commonAppData, "XXXX"); 叫做。 就我而言,这些初始化按照您编写它们的确切顺序发生 – 所以将s_commonAppData放置至少两行;)

当在加载类型的过程中执行的代码抛出exception时,会发生System.TypeInitializationException

当.NET加载类型时,它必须在您第一次使用该类型之前准备其所有静态字段。 有时,初始化需要运行代码。 当代码失败时,您将获得System.TypeInitializationException

在您的特定情况下,以下三个静态字段运行一些代码:

 private static string s_bstCommonAppData = Path.Combine(s_commonAppData, "XXXX"); private static string s_bstUserDataDir = Path.Combine(s_bstCommonAppData, "UserData"); private static string s_commonAppData = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 

请注意, s_bstCommonAppData依赖于s_commonAppData ,但它在其依赖项之前被声明。 因此,在s_commonAppData时, s_commonAppData值为null ,从而导致ArgumentNullException 。 对于s_bstUserDataDirs_bstCommonAppData :它们以相反的顺序声明为所需的初始化顺序。

重新排序行以解决此问题:

 private static string s_commonAppData = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); private static string s_bstCommonAppData = Path.Combine(s_commonAppData, "XXXX"); private static string s_bstUserDataDir = Path.Combine(s_bstCommonAppData, "UserData"); 

这些行是您的问题(或者至少有一个问题,如果还有更多):

 private static string s_bstCommonAppData = Path.Combine(s_commonAppData, "XXXX"); private static string s_bstUserDataDir = Path.Combine(s_bstCommonAppData, "UserData"); private static string s_commonAppData = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 

您可以在初始化程序中为其他静态成员引用一些静态成员。 这是一个坏主意,因为编译器不知道以哪种顺序初始化它们。 结果是在s_bstCommonAppData初始化期间,依赖字段s_commonAppData尚未初始化,因此您调用Path.Combine(null, "XXXX")并且此方法不接受空参数。

您可以通过确保首先声明其他字段的初始化中使用的字段来解决此问题:

 private static string s_commonAppData = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); private static string s_bstCommonAppData = Path.Combine(s_commonAppData, "XXXX"); private static string s_bstUserDataDir = Path.Combine(s_bstCommonAppData, "UserData"); 

或使用静态构造函数显式排序分配:

 private static string s_bstCommonAppData; private static string s_bstUserDataDir; private static string s_commonAppData; static Logger() { s_commonAppData = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); s_bstCommonAppData = Path.Combine(s_commonAppData, "XXXX"); s_bstUserDataDir = Path.Combine(s_bstCommonAppData, "UserData"); } 

一世。 请检查TypeInitializationExceptionInnerException属性

II。 此外,这可能是由于程序集的运行时版本之间不匹配而发生的。 请validation主程序集(调用应用程序)和引用程序集的运行时版本

由于.NET Framework 4项目的app.config中存在不同的错误,我遇到了System.TypeInitializationException 。 感谢pStan让我看看app.config。 我的configSections已正确定义。 但是,其中一个部分中的未定义元素导致抛出exception。

底线是app.config中的问题可能会产生这种误导性的TypeInitializationException

通过等待访问配置值,直到您在方法内而不是在代码的类级别,app.config中的相同错误可以生成更有意义的ConfigurationErrorsException

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Configuration; using System.Collections.Specialized; namespace ConfigTest { class Program { public static string machinename; public static string hostname; public static NameValueCollection _AppSettings; static void Main(string[] args) { machinename = System.Net.Dns.GetHostName().ToLower(); hostname = "abc.com";// System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).HostName.ToLower().Replace(machinename + ".", ""); _AppSettings = ConfigurationManager.GetSection("domain/" + hostname) as System.Collections.Specialized.NameValueCollection; } } } 

我知道这是一个老问题,但我最近有这个错误,所以我想我会通过我的解决方案。

我的错误似乎源于旧的App.Config文件和从.Net 4.0到.Net 4.5.1的“就地”升级。

当我在升级到Framework 4.5.1之后启动旧项目时,我得到了TypeInitializationException ……就此而言……甚至无法单步执行一行代码。

在创建一个全新的wpf项目进行测试后,我发现新的App.Config文件需要以下内容。

    

一旦我放弃了,我就开始了。

请注意,您的需求可能略有不同。 我将创建一个虚拟项目,检查生成的App.Config文件,看看是否还有其他缺失。

希望这有助于某人。 快乐的编码!

如果您在appsetting中有自定义属性。 移动你的

    

标记到的第一个子项。

TypeInitializationException ,它作为类初始化程序抛出的exception的包装器而引发。 这个类不能被inheritance。

TypeInitializationException也称为静态构造函数。

我有system.typeintialzationException的错误,这是因为我试图移动文件时:

  File.Move(DestinationFilePath, SourceFilePath) 

该错误是由于我实际交换了路径,正确的是:

  File.Move(SourceFilePath, DestinationFilePath) 

有一个类似的问题得到相同的例外。 花了一些时间找到。 在我的例子中,我有一个静态实用程序类,其中包含一个抛出exception的构造函数(包装它)。 所以我的问题出在静态构造函数中。

我有这个问题。 如上所述,它可能是一个静态声明问题。 在我的情况下,这是因为我在DEBUG子句中有一个静态。 那是(在c#中)

 #if DEBUG public static bool DOTHISISINDEBUGONLY = false; #endif 

一切正常,直到我遵守发布版本的代码,之后我得到了这个错误 – 即使在旧版本的代码上也是如此。 一旦我从DEBUG子句中取出变量,一切都恢复正常。