我正在尝试使用带有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 & 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
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]从日志中,您可以清楚地看到System.Security.Principal.WindowsIdentity.GetCurrent违反了规则...
您能帮我吗? 是否有人尝试在MacOS上将Enterprise Library与Mono一起使用? 有什么解决方法吗?
非常感谢您的帮助和时间。 问候
答案 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);
}
//}
}
然后,重新编译,使用编译的dll到您自己的项目中,它最终将工作。
如果您还有其他疑问或疑问,请告诉我,我很乐意答复。
工作愉快, 问候
弗洛林