2017-09-08 8 views
0

솔리드 웍스 용 애드 인을 작성 중입니다. 이것은 독립 실행 형 프로그램이 아니기 때문에 실행중인 Solidworks 인스턴스 내에서만 실행되므로 디버깅만으로는 실망 스럽습니다.추가 기능에 로그 파일을 넣을 수있는 의미있는 공간

어쨌든 좋은 일이 있기 때문에 TraceSources 및 TraceListeners를 사용하여 데이터 로깅을 시작했습니다.

내 추가 기능은 여러 클래스로 구성되므로 (대충은 아님) 모든 클래스에서 TraceSources를 정의하고 구성 파일을 사용하여 이러한 소스에 동일한 수신기를 할당하는 것이 일반적입니다. 그러나이 추가 기능은 dll이고 독립 실행 형으로 실행되지 않으므로 구성 파일을 사용할 수 없습니다. 따라서, 나는 코드에서 리스너를 구성하기 위해 싱글 톤을 사용

public sealed class CustomTracer 
{ 
    private static volatile CustomTracer instance; 
    private static object syncRoot = new Object(); 

    private TextWriterTraceListener textListener; 
    public TraceListener Listener 
    { 
     get => textListener; 
    } 

    private bool _configured; 
    public bool Configured 
    { 
     get => _configured; 
    } 

    public static CustomTracer Instance 
    { 
     get 
     { 
      if (instance == null) 
      { 
       lock (syncRoot) 
       { 
        if (instance == null) 
         instance = new CustomTracer(); 
       } 
      } 

      return instance; 
     } 
    } 


    private CustomTracer(string logpath = "c:/temp/SwPUMCINAddin.log") 
    { 
     textListener= new TextWriterTraceListener(logpath); 
     Trace.AutoFlush = true; 
    } 
} 

을 다음 단순히 모든 클래스에서 사용 :

class SampleClass 
{ 
    private static readonly TraceSource Tracer = new TraceSource("MyTracer"); 

    public SampleClass() 
    { 
     SetUpTrace(); 
    } 

    private void SetUpTrace() 
    { 
     CustomTracer Listener = CustomTracer.Instance; 
     var sourceSwitch = new SourceSwitch("SourceSwitch", "Verbose"); 
     Tracer.Switch = sourceSwitch; 
     Tracer.Listeners.Add(Listener.Listener); 
    } 
} 

이 방법은 잘 작동하지만 로그 파일의 위치를 ​​알고 하드 코드 된. 이것은 - IMHO - 1) ugly이고 2) 디렉토리가 존재하지 않거나 사용자가 쓰기 권한을 갖고 있지 않으면 실패 할 수 있습니다.

로그 파일을 Solidworks의 현재 작업 디렉토리에 저장하고 싶습니다. 그러나 SolidWorks가 시작될 때 추가 기능이로드 될 가능성이 큽니다. 그러나 현재 작업 디렉토리는 다른 문서가로드 될 때 변경됩니다 (싱글 톤은 이미 인스턴스화 된 상태입니다).

config 파일을 사용하지 않고 모든 클래스의 내용을 cwd의 동일한 로그 파일에 기록하는 가장 좋은 방법은 무엇입니까?

답변

0

SolidWorks addin 로깅을 위해 NLog nuget 패키지를 사용하고 Appdata 폴더를 사용하여 Here is how to do it

을 저장하십시오.