我有一个.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参考:
我是否遗漏了某些内容,或者是否无法使用给定版本从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:
这解决了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服务的文档?
答案 0 :(得分:0)
也许这可以帮到你:
https://www.hanselman.com/blog/ReferencingNETStandardAssembliesFromBothNETCoreAndNETFramework.aspx
建议从NET461-csproj中删除所有nuget-packages,然后将此设置添加到csproj文件中(在第一个<PropertyGroup>
内):
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
然后重新添加想要的nuget-packages,它应该支持来自Net461项目的NetCore。