private static void Main(string[] args)
{
string str = null;
Logger.InitUserLogWithRotation(); // <--- error occur
...
}
When I 구축 프로젝트, it 주님으로부터그에게 오류:. 하지만 나는 그것을 실행할 때 항상 중단되었습니다.
그러나 노력했다고 디버그로 프로젝트, 처음에는 할말이다 시스템스티페니시알이제이션렉세페시옹 오류가 발생했습니다.
하지만 모든 것은 옳지 않은 것 같은데, t # 39 can& 초기화하지 가변적입니다 코드 파일을 찾을 수 있습니다.
제발 도와주세요. 새로운 i& # 39 m, 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);
}
}
',' 모든 유형의 때마다 티퍼니시알이제이션렉세페시옹 발생하며 확인란 초기화하지 논리를 가지고 있는 기술서임을 최초로 틀렸다니까 idfsysobject. 발생하며, 즉 케이스. '로그기록기'.
초기화하지 논리를 다음과 같습니다. 이 type& # 39 의 정적임 구성자를 (이 경우 - 난 didn& # 39 가 아닌 't miss it - 넌 , 로거에') 와 현장 초기화하지.
꽤 많은 필드이므로 초기화는 " uncritical"; '에서' 로거의 다음과 같은 경우를 제외하고 선:
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_commonAppData' 는 'null' 지점에 '파트리크롬바인 (s_commonAppData " XXXX",,),' 입니다. 멀리는 I& # 39, m 있는데 이러한 초기화 일어날 수 있는 정확한 오더할 너회가 작성했습니까 그러하매 동일팔레트에 '-' 그 위로 2 이상의 찬성을 s_commonAppData 흐름선;)
'코드' 가 있을 때 그 과정 중에 발생하는 시스템스티페니시알이제이션렉세페시옹 csetup 유형을 로드중 예외를 던진다.
그 전에 준비할 때 처음 유형, .NET 로드되는지 합니다 모든 정적인 필드를 사용하는 유형:. 가끔 초기화하지 코드 실행 합니다. 이 때 그 코드를 장애가 발생할 수 있는 '시스템스티페니시알이제이션렉세페시옹'.
정적인 필드를 일부 코드를 실행할 수 있는 특정 경우, 다음과 같은 세 가지:
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 것이 종속성 앞당겨 선언했다. 따라서 '가치' 는 'null' '' 호출됨 파트리크롬바인 s_commonAppData 당시에 그, 그 결과 '아르구망누 알렉세페시옹'. '이' '와' s_bstCommonAppData s_bstUserDataDir 마찬가지다. 원하는 순서대로 역뱡향으로 선언될 수 있도록 초기화.
이 문제를 해결하기 위해 다시 정렬할 흐름선.
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);
일부 정적임 너회가 참조입니다 초기화 있는 구성원을 다른 정적 멤버. # 39 이것은 안 좋은 생각 때문에 doesn& 컴파일러와의 주문하십시오 저들이요 초기화하려면 알고 있는 것이다. 그 결과 '중', '아직' 종속 필드이므로 초기화하지 s_bstCommonAppData s_commonAppData 초기화되었습니다 도왔으매 틀렸다니까 호출하십시오 파트리크롬바인 (null, XXXX" ";) '와' 이 방법을 nulll 주장을 인정하지 않았다.
이것을 해결할 수 있다는 것을 확실히 하는 필드용 초기화하지 사용되는 다른 필드는 첫 선언했다.
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");
}
내가 경험한 '' 내 .NET framework 4 project& 시스템스티페니시알이제이션렉세페시옹 # 39 의 아프리카누스프리그스 인해 다른 오류 나를 가져오는 파스턴 아프리카누스프리그스 살펴보는 데 감사합니다. 내 콘피그체티언스 제대로 정의되어 있다. 그러나 정의되지 않은 요소 중 발생할 수 있는 단면에는 예외가 발생합니다.
이 문제가 생길 수 있는 것은 매우 잘못된 티퍼니시알이제이션렉세페시옹 대퍼콘피그 생성할지 '결론'.
콘피그라티온에로스엑스티온 의해 생성될 수 있는 의미 있는 '보다' 에 의해 대퍼콘피그 기다림커서 같은 오류가 아닌 선수단 내부의 구성용 값을 액세스하려면 때까지 메서드입니다 class 레벨 코드가.
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;
}
}
}
만약 이 오래된 질문, 하지만 난 그러니까말이야 이는 비트 오류 때문에 내 솔루션이므로 최근 생각해봤죠 꼭 이래야겠어요 전달하십시오 따라.
내 에서 오류가 있는 것 같다 '라는 파일 및 이전 대퍼콘피그 " place"; net 에서 업그레이드합니다 4.0 에서 .net 4.5.1.
이전 사업을 시작했을 때 나는 attaboy 를 업그레이드한 뒤 후속 레임워크 4.5.1 티퍼니시알이제이션렉세페시옹. 방망이를 맞아 떨어져. 심지어 단계별로 코드 한 줄 수 있다.
내가 만든 것으로, 새로운 대퍼콘피그 테스트하려면 brand new wpf 프로젝트는 다음과 같은 파일 한다.
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="YourAppName.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
내가 있는 한, 난 롬폭 경영학이라 떨어트림
단, 필요에 따라 조금씩 차이가 있을 수 있습니다. 내가 만들어 갈 것 "이라고 더미 프로젝트 파일 및 지켜보리니 대퍼콘피그 생성할지 체크아웃합니다 경우 다른 사항은요 없습니다.
따라서 누군가가 바란다. 즐거운 코딩!
내가 가진 이 문제가 발생합니다. 그것은 아마도 언급된 바와 같이 정적 선언 문제를 해결할 수 있습니다. 왜냐하면 내가 가진 것은 내 경우에는 정적 내의 디버그입니다 핵심이 되는 말이다. 즉 (c # 에서)
#if DEBUG
public static bool DOTHISISINDEBUGONLY = false;
#endif
그리고 그 이후로 나는 모든 것을 fine until I 협력했습니다 작성된 코드를 공개 버전은 이전 버전의 맡을게 오류- 대해서도 릴리스에서는 코드. 당시 내가 모든 것을 한 번 절을 가변적입니다 디버그로 빼냅니다 정상으로 돌아왔다.