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

Enterprise Library Logging - Visual Studio - MONO - MacOSX - NotImplementedException

我正在尝试使用 Microsoft Enterprise Library 6.0.1304 为 Mac (Mono 6.0.0.296) 使用新的 VisualStudio。不幸的是,我无法使用它,因为引发了 "NotImplementedException"。

多年来我一直在使用 Enterprise Library,但在 Visual Studio (Windows Env.) 中它很棒,但是当我尝试在单声道下使用它时,一切似乎都不起作用。

经过一番搜索,我发现mscorlib.dll for MONO dows not support WindowsIdentity "User" 属性.

mscorlib.dll (4.0.0.0 - 单声道)

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/201916:36:11

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

企业图书馆分销商服务摘要:

--> 信息: 时间戳:12/07/2019 14:36:11 消息:应用程序正在运行 类别:一般 优先级:5 事件编号:2000 严重性:信息 标题: Mac海因:MacBook-Pro-di-John 应用域:F.B.Library.exe ProcessId:无法读取内部 属性。错误信息:GetCurrentProcessId 进程名称:无法读取内部 属性。错误信息:GetModuleHandle 线程名称: Win32 ThreadId:Unable 读取内在 属性。错误信息:GetCurrentThreadId 扩展属性: --> MachineName: MacBook-Pro-di-John --> 时间戳:12/07/2019 14:36:11 --> FullName: Microsoft.Practices.EnterpriseLibrary.Logging, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 --> 应用域名:F.B.Library.exe --> Windows身份:jfk

异常信息详情:

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

StackTrace 信息详情:

at System.Security.Principal.WindowsIdentity.GetCurrent (System.Boolean ifImpersonating) [0x00000] in /Users/builder/jenkins/workspace/build-package-osx-mono/2019-02/external/bockbuild/builds/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] 在:0

在 Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter+<>c__DisplayClass13.b__12 () [0x0007f] 在 :0

从日志中可以清楚地看到System.Security.Principal.WindowsIdentity.GetCurrent 打破了规则...

你能帮我解决这个问题吗? 有没有人尝试在 MacOS 上将 Enterprise Library 与 Mono 一起使用? 是否有解决方法?

非常感谢您的帮助和时间。 此致,

我终于解决了这种情况。 首先,感谢所有评论,这些评论帮助我解决了很多问题。 基本上,我必须更改 MEL 6 代码的一部分,然后我才能毫无问题地使用它。

正如@SushiHangover 先前所建议的那样,我获取了 MEL 6 源代码并开始分析...我弄错了在 mscorlib.dll[= 中调用 SecurityIdentifier User 的部分代码13=]

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

编译 prj 后,找到并评论以下部分的 "Impersonation" 部分:

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用到自己的工程中,终于可以了。

如果您有任何进一步的问题或疑问,请告诉我,我很乐意回复。

祝你工作愉快, 此致,

弗罗林