企业库日志记录-Visual Studio-MONO-MacOSX-NotImplementedException

时间:2019-07-12 14:59:46

标签: c# .net logging mono enterprise-library

我正在尝试使用带有Microsoft Enterprise Library 6.0.1304的新的Visual Studio for Mac(Mono 6.0.0.296)。不幸的是,由于引发了“ NotImplementedException”,我无法使用它。

我已经使用Enterprise Library多年了,但是在Visual Studio(Windows Env。)中,它很棒,但是当我尝试在mono下使用相同功能时,一切似乎都无法正常工作。

经过一些搜索,我可以看到用于单声道dows的mscorlib.dll不支持WindowsIdentity“用户”属性。

mscorlib.dll(4.0.0.0-MONO)

using System.Runtime.InteropServices;

[MonoTODO ("not implemented")]
[ComVisible (false)]
public SecurityIdentifier User {
    get {
        throw new NotImplementedException ();
    }
}

应用程序:

public static void Main (string [] args) 
{
    LogWriter logWriter = new LogWriterFactory ().Create ();
    Logger.SetLogWriter (logWriter, false);         
    logWriter.Write ("Application is working", "General", 5, 2000, TraceEventType.Information);         
}

App.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" />  
  </configSections>
  <loggingConfiguration name="" 
                        tracingEnabled="false" 
                        defaultCategory="General"  
                        logWarningsWhenNoCategoriesMatch="false">    
    <listeners>  
        <add name="Rolling Flat File Trace Listener" 
             type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.RollingFlatFileTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"        
             listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.RollingFlatFileTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"  
             fileName="RollingFlatFile.log"  
             footer="----------------------------------" 
             formatter="Text Formatter"  
             header="" rollInterval="Day"  
             traceOutputOptions="DateTime, Timestamp" 
             filter="All" />          
    </listeners>  
    <formatters>  
        <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"  
             template="Timestamp: {timestamp(local)}{newline}  
                       Message: {message}{newline}  
                       Category: {category}{newline}  
                       Priority: {priority}{newline}  
                       Severity: {severity}"  
             name="Text Formatter" />  
    </formatters>  
    <categorySources>  
        <add switchValue="All" autoFlush="true" name="General">  
            <listeners>  
                <add name="Rolling Flat File Trace Listener" />    
            </listeners>  
        </add>  
    </categorySources>  
    <specialSources>  
        <allEvents switchValue="All" name="All Events">  
            <listeners>  
                <add name="Rolling Flat File Trace Listener" />  
            </listeners>  
        </allEvents>  
        <notProcessed switchValue="All" name="Unprocessed Category">  
            <listeners>  
                <add name="Rolling Flat File Trace Listener" />  
            </listeners>  
        </notProcessed>  
        <errors switchValue="All" name="Logging Errors &amp; Warnings">  
            <listeners>  
                <add name="Rolling Flat File Trace Listener" />  
            </listeners>  
        </errors>  
    </specialSources>  
  </loggingConfiguration>  
</configuration>

错误已跟踪到文件中

时间戳:12/07/2019 16:36:11

消息:消息处理失败。有关更多信息,请参见下面的摘要信息。如果此问题仍然存在,请停止服务并检查配置文件,以确认类别和接收器的配置中是否可能存在错误。

企业库分发服务摘要:

-> 信息: 时间戳:12/07/2019 14:36:11 消息:应用程序正在工作 分类:一般 优先级:5 EventId:2000 严重程度:信息 标题: 机器:MacBook-Pro-di-John 应用程序域:F.B.Library.exe ProcessId:无法读取固有属性。错误消息:GetCurrentProcessId 进程名称:无法读取固有属性。错误消息:GetModuleHandle 线程名称: Win32 ThreadId:无法读取固有属性。错误消息:GetCurrentThreadId 扩展属性: -> MachineName:MacBook Pro-di-John ->时间戳:12/07/2019 14:36:11 ->全名:Microsoft.Practices.EnterpriseLibrary.Logging,Version = 6.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35 -> AppDomainName:F.B.Library.exe -> WindowsIdentity:jfk

异常信息详细信息:

异常类型:System.NotImplementedException 消息:该方法或操作未实现。 数据:System.Collections.ListDictionaryInternal TargetSite:System.Security.Principal.WindowsIdentity GetCurrent(Boolean) 帮助链接:NULL 资料来源:mscorlib HResult:-2147467263

StackTrace信息详细信息:

在/ Users / builder / jenkins / workspace / build-package-osx-mono / 2019-02 / external / bockbuild / builds /中的System.Security.Principal.WindowsIdentity.GetCurrent(System.Boolean ifImpersonating)[0x00000]中的

mono-x64 / mcs / class / corlib / System.Security.Principal / WindowsIdentity.cs:165   在Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter.RevertExistingImpersonation()[0x0000f]中的:0   :

中位于Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter.ProcessLog(Microsoft.Practices.EnterpriseLibrary.Logging.LogEntry日志,System.Diagnostics.TraceEventCache traceEventCache)中的[0x00000]

,位于Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter + <:0中的c__DisplayClass13.b__12()[0x0007f]

从日志中,您可以清楚地看到System.Security.Principal.WindowsIdentity.GetCurrent违反了规则...

您能帮我吗? 是否有人尝试在MacOS上将Enterprise Library与Mono一起使用? 有什么解决方法吗?

非常感谢您的帮助和时间。 问候

1 个答案:

答案 0 :(得分:0)

最后,我已经解决了这种情况。 首先,感谢所有评论,这些内容为我提供了很多解决方案。 基本上,我必须更改MEL 6代码的一部分,然后我才能毫无问题地使用它。

如@SushiHangover先前建议的那样,我获取了MEL 6源代码,并且开始分析...我已经找到了一部分在mscorlib.dll中调用SecurityIdentifier User的代码

我所做的是: -下载MEL 6源代码 -使用Visual Studio for MAC打开它 -删除引擎不支持的所有测试项目和文件 -编译到一切正常为止

编译完prj后,请找到以下部分的“假冒”部分并对其进行评论:

private void ProcessLog(LogEntry log, TraceEventCache traceEventCache)
    {
        // revert any outstanding impersonation
        //using (RevertExistingImpersonation())
        //{
            var items = new ContextItems();
            items.ProcessContextItems(log);

            var matchingTraceSources = GetMatchingTraceSources(log);
            var traceListenerFilter = new TraceListenerFilter();

            foreach (LogSource traceSource in matchingTraceSources)
            {
                traceSource.TraceData(log.Severity, log.EventId, log, traceListenerFilter, traceEventCache, ReportExceptionDuringTracing);
            }
        //}
    }

Code Sample Image Link

然后,重新编译,使用编译的dll到您自己的项目中,它最终将工作。

如果您还有其他疑问或疑问,请告诉我,我很乐意答复。

工作愉快, 问候

弗洛林