小编361*_*615的帖子

调试器引擎.方法重写,局部变量提升和变量解析

我正在使用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.变量xz在生成的结构上提升,无法直接解析图片.

所以问题是:如何在yield方法和异步方法中调试局部变量期间解决?

在对我之前的问题的评论中,@ Brian Reichle给了我一些提示,告诉我如何在现有变量和提升变量之间进行映射.探索SymAttribute和Roslyn源我得出的结论是它不直接存储它们之间的映射.SymAttribute用于获取CustomDebugInfoRecord,存储部分此信息(来自Roslyn的Used …

c# debugging cil hoisting roslyn

5
推荐指数
1
解决办法
141
查看次数

在没有.NET Core SDK的情况下将ASP.NET Core MVC作为控制台应用程序项目运行

问题背景

我正在创建一个工具,可以生成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)

c# msbuild asp.net-mvc asp.net-core

5
推荐指数
1
解决办法
9560
查看次数

从异步请求返回缓存条目时锁定

我写了一个方法,应该从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)

c# web-services locking async-await memorycache

0
推荐指数
1
解决办法
377
查看次数

WPF MVVM UI如果线程阻塞,则不会更新

我有一个窗口:

<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# wpf multithreading mvvm

0
推荐指数
1
解决办法
886
查看次数