【发布时间】:2018-09-26 01:01:03
【问题描述】:
我有一个使用 log4net nuget 版本 2.0.8 的 .netstandard 2.0 库。我有一个使用该库的 Windows 服务(.net 框架 4.6.1)。
我参考了以下链接: configuring log4net in .net core
log4net 日志记录在 .net 核心应用程序中按预期工作。但是使用 Windows 服务部署时会出错。
(FileNotFoundException: System.IO.FileNotFoundException: 无法加载文件或程序集 'System.Runtime, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。系统找不到指定的文件.)
在部署时,我将以下文件放入部署文件夹(来自 Windows 服务 bin 文件夹):
(1)windows服务.exe文件和exe.config文件
(2) 一个 log4net.config xml 文件,其中包含上面链接中提到的 log4net 配置
(3) netstandard.dll
(4) PublishOutput 文件夹,在发布 .net 标准库后(该文件夹中没有 Runtime dll)
(5)安装windows服务并启动(windows 8.1 OS)
以下是显示的 log4net nuget 参考:
我是否遗漏了什么,或者无法从 Windows 服务中使用给定版本运行 log4net?
附加信息: log4net 配置如下:
var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
log4net.Config.XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));
ILog _logger = LogManager.GetLogger(Assembly.GetEntryAssembly(), "someValue");
更新 1:
我在部署文件夹中添加了以下 dll:
- System.Runtime.dll
- System.Reflection.dll
- System.IO.FileSystem.dll
- System.Runtime.InteropServices.RuntimeInformation.dll
这解决了 FileNotFoundException。现在我得到以下异常:
System.TypeInitializationException:“log4net.Core.LoggerManager”的类型初始化程序引发了异常。 ---> System.MethodAccessException:尝试通过安全透明方法“log4net.Core.LoggerManager.GetVersionInfo()”访问安全关键方法“System.Runtime.InteropServices.RuntimeInformation.get_FrameworkDescription()”失败。 程序集 'log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a' 标有 AllowPartiallyTrustedCallersAttribute,并使用 2 级安全透明模型。 2 级透明度会导致 AllowPartiallyTrustedCallers 程序集中的所有方法默认变为安全透明,这可能是此异常的原因。 在 log4net.Core.LoggerManager.GetVersionInfo() 在 log4net.Core.LoggerManager..cctor() --- 内部异常堆栈跟踪结束 --- 在 log4net.Core.LoggerManager.GetRepository(Assembly repositoryAssembly)
更新 2:
采用以下方法似乎可以解决一些问题,并且至少可以启动应用程序。我将标签<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> 添加到.net 标准库csproj 文件中。因此,在编译库时,我得到了引用项目和 nuget 库的所有引用 dll。我首先将它们放在部署文件夹中,然后复制粘贴从构建 Windows 服务获得的 dll。现在应用程序开始工作,但给出了我正在研究的其他问题。
重要提示:还必须将 log4net nuget 引用添加到 windows 服务,否则该服务将无法工作。想知道 netstandard 库中使用的所有 nuget 引用是否也需要添加到 Windows 服务项目中?
是否有任何关于如何部署引用 .netstandard 库的 Windows 服务的文档?
【问题讨论】:
标签: c# .net-core windows-services log4net