2017-09-08 6 views
0

Je suis en train d'écrire un complément pour Solidworks. Parce que ce n'est pas un programme autonome, mais qu'il n'est exécuté que dans une instance en cours d'exécution de Solidworks, le débogage seul est plutôt frustrant. Donc, et parce que c'est une bonne chose à faire de toute façon, j'ai commencé à enregistrer des données en utilisant TraceSources et TraceListeners.Emplacement significatif pour mettre le fichier journal dans le complément

Mon complément se compose de plusieurs classes (ce qui n'est pas un gros problème), donc l'approche habituelle serait de définir TraceSources dans chaque classe et d'utiliser un fichier de configuration pour assigner le même écouteur à ces sources. Cependant, comme ce complément est une DLL et ne fonctionne pas en mode autonome, je ne peux pas utiliser un fichier de configuration. Par conséquent, j'utilise un Singleton pour configurer les auditeurs dans le code:

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; 
    } 
} 

et puis tout simplement les utiliser dans toutes les classes:

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); 
    } 
} 

Cette approche fonctionne très bien, mais sais que j'ai l'emplacement du fichier journal codé en dur. Ceci est - IMHO - 1) laid et 2) peut échouer si le répertoire n'existe pas ou si l'utilisateur n'a pas d'autorisation permiss.

Je voudrais stocker le fichier journal dans le répertoire de travail courant de Solidworks. Toutefois, l'extension est probablement chargée au démarrage de Solidworks. Le répertoire de travail actuel change cependant quand un document différent est chargé (le singleton est déjà instancié alors).

Quelle serait la meilleure approche pour consigner le contenu de toutes les classes dans le même fichier journal dans cwd sans utiliser de fichier de configuration?

Répondre

0

Essayez d'utiliser le package NLog nuget pour la consignation de votre ajout SolidWorks et utilisez le dossier Appdata pour stocker votre Here is how to do it