我正在使用依赖项注入(Microsoft.Extensions.DependencyInjection)开发.NET Core 2.1控制台应用程序。代码看起来像这样:
class Program
{
static async Task Main(string[] args)
{
//...
var configuration = GetConfiguration();
var serviceProvider = ConfigureServices(configuration);
var importer = serviceProvider.GetRequiredService<DataImporter>();
var result = await importer.ImportCentersAndStores(fileName);
//...
}
private static IConfigurationRoot GetConfiguration()
{
return new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
}
private static ServiceProvider ConfigureServices(IConfigurationRoot configuration)
{
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
return new ServiceCollection()
.AddLogging(builder =>
{
builder.AddConfiguration(configuration.GetSection("Logging"));
builder.AddConsole();
})
.AddOptions()
.AddAutoMapper()
.AddDatabase(configuration.GetConnectionString("Blah"))
.AddTransient<DataImporter>()
.BuildServiceProvider();
}
}
DataImporter
类和ImportCentersAndStores
方法没什么特别的-它做了很多事情,包括读取Excel文件和进行一些日志记录。我认为该代码的性质无关紧要。
现在的问题是,只要在DataImporter
类内引发异常,堆栈跟踪就不会包含带有我的代码的帧:
调试显示如下:
无论我是否捕获到引发的异常,都会发生这种情况。上述异常发生在DataImporter
中从ImportCentersAndStores
调用的方法中。因此,我的代码应该有两个框架。
没有调试上下文。我无法检查变量或其他任何东西。
我不知道System.Private.CoreLib
是什么,也不知道为什么它占用了大部分调用堆栈。我不知道问题是否真的与我使用DI有关。
我的代码没什么区别。例外设置是默认设置。我看不到任何应该执行此操作的调试选项。
以防万一:我已将其包含在项目文件中以启用异步Main方法:
<LangVersion>7.1</LangVersion>
任何人都可以阐明这一点吗?
答案 0 :(得分:1)
在第二个屏幕截图上:异常助手(弹出窗口)->查看详细信息->堆栈跟踪。在插入async
香肠之前引发异常时,这将是正确的堆栈跟踪。
所以-是的-这种行为是由于您的async
所致。老实说,这令我感到好奇,为什么您会在控制台应用程序中做任何async
的事情?