ServiceProvider.GetService<Type> 每次使用都会抛出异常

Posted

技术标签:

【中文标题】ServiceProvider.GetService<Type> 每次使用都会抛出异常【英文标题】:ServiceProvider.GetService<Type> throw exception for every usage 【发布时间】:2020-02-25 00:54:09 【问题描述】:

我是整个 C# .Net 环境的新手,我正在尝试将一个简单的 Console .NetCore 3 应用程序从 MacOS 10.14 部署到 windows server 2012 R2 问题是该应用程序确实可以在 macOS 上运行,但在 Windows 上部署后它不起作用 在服务器上这是代码

IServiceCollection services = new ServiceCollection();
services.AddLogging();
var serviceProvider = services.BuildServiceProvider();
var loggerFactory = serviceProvider.GetService<ILoggerFactory>();
Console.ReadKey();

我已经多次调试代码,只有在 GetService 方法时才会抛出异常 像这里一样使用

var loggerFactory = serviceProvider.GetService<ILoggerFactory>();

异常消息是

Microsoft.Extentions.DependecnyInjection.DependencyInjectionEventSource 的类型初始化程序引发异常

我已经搜索了解决方案,但没有找到任何解决方案,甚至没有一个接近的解决方案。

编辑 1:

这里有更多关于错误的细节,希望它可以帮助

    异常消息:

    类型初始化器 'Microsoft.Extensions.DependencyInjection.DependencyInjectionEventSource' 抛出异常。

      堆栈跟踪:

    在 Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.CreateServiceAccessor(类型 serviceType e) 在 System.Collections.Concurrent.ConcurrentDictionary2.GetOrAdd(TKey key, Func2 valueFactory) 在 Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(类型 serviceType, ServiceProviderEngineScope serviceProviderEngineScope) 在 Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(类型 服务类型)在 Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(类型 服务类型)在 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](IServiceProvider 提供者)

    在 Inj.Program.Main(String[] args) 中 /Users/programmer/VSProjects/Inj/Inj/Program.cs:第 19 行

      内部异常:

    System.ArgumentException:外部组件已引发异常。 在 System.Globalization.CompareInfo.CompareString(ReadOnlySpan1 string1, ReadOnlySpan1 string2,CompareOptions 选项) System.Globalization.CompareInfo.Compare(字符串 string1,字符串 string2,CompareOptions 选项)在 System.Globalization.TextInfo.PopulateIsAsciiCasingSameAsInvariant() 在 System.Globalization.TextInfo.ChangeCaseCommon [TConversion](字符串 源) 在 System.Globalization.TextInfo.ToUpper(String str) 在 System.String.ToUpperInvariant() 在 System.Diagnostics.Tracing.EventSource.GetGuid(类型 eventSourceType) 在 System.Diagnostics.Tracing.EventSource..ctor(EventSourceSettings 设置,字符串 [] 特征)在 System.Diagnostics.Tracing.EventSource..ctor(EventSourceSettings 设置)在 Microsoft.Extensions.DependencyInjection.DependencyInjectionEventSource..ctor() 在 Microsoft.Extensions.DependencyInjection.DependencyInjectionEventSource..cctor()

【问题讨论】:

嗨 jimmy mac,InnerException 说了什么? System.ArgumentException: External component has throw an exception 感谢您的快速回放 你拥有扩展方法IServiceCollection.AddLogging吗? (如果有,可以分享一下吗?) 您是否在ConfigureServices 方法中解析ILoggerFactory。或者,您直接在Configure 方法中注入ILoggerFactory 不,我没有任何扩展方法。 @IvanGarcíaTopete 【参考方案1】:

似乎问题与将应用程序作为 dll 运行有关,需要做的是将应用程序发布为目标平台的自包含可执行文件,所以在我的情况下,我刚刚使用 MacOs 10.14 在 Windows server 2012 R2 上发布以下命令(此命令不会直接发布到服务器,您需要将结果文件夹移动到服务器上的共享目录)

dotnet 发布 -c 发布 -r win10-x64

更好

dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true

移动文件夹后,我运行了 .exe windows 可执行文件,现在它像魅力一样工作

【讨论】:

以上是关于ServiceProvider.GetService<Type> 每次使用都会抛出异常的主要内容,如果未能解决你的问题,请参考以下文章