带有.net标准库的log4net,在windows服务

时间:2018-04-16 10:11:43

标签: c# .net-core windows-services log4net

我有一个.netstandard 2.0库,它使用log4net nuget版本2.0.8。我有一个使用该库的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 service .exe文件和exe.config文件

(2)一个log4net.config xml文件,其中包含上面链接中提到的log4net配置

(3)netstandard.dll

(4)PublishOutput文件夹,发布.netstandard库后(该文件夹中没有Runtime dll)

(5)安装Windows服务并启动(Windows 8.1操作系统)

以下是显示的log4net nuget参考:

enter image description here

我是否遗漏了某些内容,或者是否无法使用给定版本从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程序集中的所有方法默认情况下变为透明安全性,这可能是此异常的原因。    at log4net.Core.LoggerManager.GetVersionInfo()    在log4net.Core.LoggerManager..cctor()    ---内部异常堆栈跟踪结束---    at log4net.Core.LoggerManager.GetRepository(Assembly repositoryAssembly)

更新2: 采用以下方法似乎可以解决一些问题,至少可以启动应用程序。我将标记<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>添加到.net标准库csproj文件中。因此,在编译库时,我获得了引用项目和nuget库的所有引用dll。我首先将它们放在部署文件夹中,然后复制粘贴从构建windows服务获得的dll。现在应用程序开始工作,但提出了我正在研究的其他问题。

重要提示:还必须将log4net nuget引用添加到Windows服务,否则服务不起作用。想知道netstandard库中使用的所有nuget引用是否也需要添加到windows服务项目中?

是否有任何关于如何部署引用.netstandard库的Windows服务的文档?

1 个答案:

答案 0 :(得分:0)

也许这可以帮到你:

https://www.hanselman.com/blog/ReferencingNETStandardAssembliesFromBothNETCoreAndNETFramework.aspx

建议从NET461-csproj中删除所有nuget-packages,然后将此设置添加到csproj文件中(在第一个<PropertyGroup>内):

<RestoreProjectStyle>PackageReference</RestoreProjectStyle>

然后重新添加想要的nuget-packages,它应该支持来自Net461项目的NetCore。