我正在使用MDBG示例制作托管.NET调试器.它适用于简单的场景,但在发生方法重写时会出现问题.最关键的部分是yield方法和异步方法.
我已经问了一个更普遍的问题,对这些问题.现在我想专注于局部变量解析.请考虑以下代码:
using System;
using System.Threading.Tasks;
class C
{
public static void Main() {
var instance = new Instance();
instance.Start().Wait();
}
}
class Instance
{
public static async Task F() { for(var i=0; i<100; i++) { Console.WriteLine(i); await Task.Delay(100); } }
public async Task Start() {
var z = "test";<------- Breakpoint
var x = 10;
await F();
}
}
Run Code Online (Sandbox Code Playgroud)
当调试器到达断点时,我查询调试器以获取局部变量,唯一的变量是this.变量x并z在生成的结构上提升,无法直接解析
.
所以问题是:如何在yield方法和异步方法中调试局部变量期间解决?
在对我之前的问题的评论中,@ Brian Reichle给了我一些提示,告诉我如何在现有变量和提升变量之间进行映射.探索SymAttribute和Roslyn源我得出的结论是它不直接存储它们之间的映射.SymAttribute用于获取CustomDebugInfoRecord,存储部分此信息(来自Roslyn的Used …
问题背景
我正在创建一个工具,可以生成MVC解决方案(*.sln)和构建(使用msbuild),以便可以部署它们.工具需要.NET Framework 4.5.2.
现在我想生成ASP.NET Core MVC应用程序.这样的应用程序可以在4.5.X下运行,但是我不确定msbuild是否可以处理project.json(所以我使用的是packages.config)并且我无法安装.NET Core,因为每个教程都表明是开发ASP.NET的先决条件核心.目前我计划在Windows上部署生成的应用程序.
问题:
因此,我创建了一个简单的控制台应用程序而不是.NET Core项目:
在那里我安装了所有需要的包,比如:
<package id="Microsoft.AspNetCore.Mvc" version="1.0.1" targetFramework="net452" />
Run Code Online (Sandbox Code Playgroud)
并使用Kestrel SelfHosted应用程序:
public class Program {
static void Main() {
var host = new WebHostBuilder()
.UseKestrel()
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run();
}
}
Run Code Online (Sandbox Code Playgroud)
我添加了一个带有View的Controller.当我执行请求时,控制器被命中,但View无法在运行时编译:

这种行为是否与我使用控制台应用程序而不是ASP.NET核心Web应用程序有关?是否可以创建一个功能齐全的MVC应用程序作为一个简单的控制台应用程序?
更新:
我想我已经找到了一个灵感来自阅读github 问题的解决方法:
public void ConfigureServices(IServiceCollection services) {
services.AddMvc()
.AddRazorOptions(options => {
var previous = options.CompilationCallback;
options.CompilationCallback = context => {
previous?.Invoke(context);
var refs = AppDomain.CurrentDomain.GetAssemblies()
.Where(x => !x.IsDynamic)
.Select(x => MetadataReference.CreateFromFile(x.Location))
.ToList();
context.Compilation …Run Code Online (Sandbox Code Playgroud) 我写了一个方法,应该从Web服务获取一些信息.我想避免额外调用该服务,所以我试图根据这篇文章将信息放入MemoryCache .
不同之处在于我在客户端没有"SomeHeavyAndExpensiveCalculation",但我将工作委托给了Web服务.所以我想等待电话.
据我了解当前的实现,我可能有多个请求到Web服务器,因为我无法等待锁内的请求,这就是为什么它被移出锁.
有更好的解决方案吗?
谢谢.
private static readonly object CompanyInfoLock = new object();
public async Task<CompanyDto> GetCompanyInfo()
{
const string cacheKey = "_COMPANYINFO_";
CompanyDto companyInfo = MemoryCache.Default[cacheKey] as CompanyDto;
if (companyInfo != null) return companyInfo;
CompanyDto company = await _userManagementService.InvokeAsync(x => x.GetCompanyAsync(AppPrincipal.Current.CurrentCompanyId));
lock (CompanyInfoLock)
{
companyInfo = MemoryCache.Default[cacheKey] as CompanyDto;
if (companyInfo != null) return companyInfo;
MemoryCache.Default.Add(cacheKey, company, new CacheItemPolicy
{
SlidingExpiration = new TimeSpan(2, 0, 0)
});
}
return company;
}
Run Code Online (Sandbox Code Playgroud) 我有一个窗口:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication1"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<StackPanel Orientation="Horizontal" Background="{Binding BackgroundColor}">
<Button Content="Button1" Click="ButtonBase_OnClick"/>
</StackPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)
而这个CodeBehind窗口:
using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using WpfApplication1.Annotations;
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window, INotifyPropertyChanged
{
private Brush _backgroundColor;
public MainWindow()
{
InitializeComponent();
DataContext = this;
Background = Brushes.Orange;
}
public Brush BackgroundColor
{
get { …Run Code Online (Sandbox Code Playgroud) c# ×4
asp.net-core ×1
asp.net-mvc ×1
async-await ×1
cil ×1
debugging ×1
hoisting ×1
locking ×1
memorycache ×1
msbuild ×1
mvvm ×1
roslyn ×1
web-services ×1
wpf ×1