小编Sin*_*nix的帖子

Visual Studio:编辑并继续处理异常?

这是一个代码,重现了我期望获得的行为:

    static void Main(string[] args)
    {
        // try // #2
        {
            string x = null; // #1
            AssertNotNull(x, nameof(x));
        }
        // catch (ArgumentNullException) { } // #2
        Console.WriteLine("Passed.");
        Console.ReadKey();
    }

    [DebuggerHidden]
    public static void AssertNotNull<T>(T arg, string argName) where T : class
    {
        if (arg == null)
            throw new ArgumentNullException(argName);
    }
Run Code Online (Sandbox Code Playgroud)

从VS2008开始的任何VS的行为都是相同的(没有检查早期版本).

如果在调试下运行它(使用标准调试设置),则在修复代码(使用EnC)之前不允许继续.点击F5将重新运行断言,因为[DebuggerHidden]和"Unwind stack on unhandled exception"设置组合(默认情况下启用设置).

要修复代码,只需将#1行替换为object x = "",将下一个语句设置为它并再次点击F5.

现在,为ArgumentNullException启用"thrown thrown"并取消注释标记为#2的行.行为改变:你再次断言断言,但堆栈没有解除(很容易用CallStack窗口检查).F5将从抛出异常的地方继续.

好的,所以...现在的问题是:在打破处理的异常时,有没有办法启用自动堆栈展开?

隐藏VS选项,现有扩展或(可能)API可以在我自己的扩展中使用?

UPD:澄清一个问题:我想在断言失败的情况下中断,用编辑编辑代码并继续,将next语句设置为固定代码并继续执行.

如果异常没有被捕获到堆栈,它可以正常工作.

UPD2由Hans Passant提出:在UserVoice上发表了一条建议 …

c# debugging visual-studio

10
推荐指数
1
解决办法
606
查看次数

检查pdb文件是否与源匹配

我想写一个检查证明给定程序集附近有有效的pdb文件,并且存储在pdb中的校验和与源校验和匹配.

该检查过去在我们的CI服务器上被称为单元测试,以防止在构建服务器配置被破坏时发布二进制文件(例如,使用不同的git分支来构建代码).

如果可能,它应该接受MethodInfo作为输入参数.我想仔细检查并验证方法的源行是估计的.

第一部分,阅读特定方法的来源非常简单.这是一个样本.

困难的部分是检查PDB中所有文档的校验和.标准System.Diagnostics.SymbolStore.SymDocument.GetCheckSum()抛出NotImplementedException所以我肯定需要使用别的东西.

有什么建议吗?

UPD.试图澄清:)

  1. 我有兴趣检查源文件的校验和是否与存储在PDB文件中的校验和匹配,第一部分(检查pdb匹配二进制文件)已经完成.

  2. 我正在为此任务寻找一些API,因为我不想解析控制台输出.此外,我不希望在我们的CI服务器上安装任何其他SDK,因为它需要额外的时间来证明没有任何损坏.

c# debug-symbols pdb

7
推荐指数
1
解决办法
1152
查看次数

将Azure Resource Group项目部署为MsBuild脚本的一部分

我正在尝试将我们的解决方案从经典迁移到资源管理器部署,并且我坚持运行RM部署作为MsBuild构建脚本的一步.对于经典项目有

      <MSBuild Projects="SomeAzureProject\SomeAzureProject.ccproj"
                     Targets="Publish"
                     Properties="
                     VisualStudioVersion=$(VisualStudioVersion);
                     Configuration=$(CloudConfiguration);
                     Platform=$(Platform);
                     TargetProfile=$(CloudTargetProfile);
                     PublishProfile=$(CloudPublishProfile);
                     PublishDir=$(CloudPublishDir);"></MSBuild>
Run Code Online (Sandbox Code Playgroud)

建立步骤.

.deployproj有这样的东西吗?如果是 - 应该将哪些参数传递给它?(我们需要能够至少传递资源组名称,params文件名和模板文件名).

msbuild azure-resource-group

5
推荐指数
0
解决办法
108
查看次数

嵌套多线程操作跟踪

我的代码相似

void ExecuteTraced(Action a, string message)
{
    TraceOpStart(message);
    a();
    TraceOpEnd(message);
}
Run Code Online (Sandbox Code Playgroud)

回调(a)可以再次调用ExecuteTraced,在某些情况下,异步调用(通过ThreadPool,BeginInvoke,PLINQ等,因此我无法明确标记操作范围).我想跟踪嵌套的所有操作(即使它们异步执行).所以,我需要能够在逻辑调用上下文中获得最后的跟踪操作(可能有很多并发线程,因此不可能使用lastTraced静态字段).

有CallContext.LogicalGetData和CallContext.LogicalSetData,但不幸的是,LogicalCallContext在调用EndInvoke()时将更改传播回父上下文.更糟糕的是,如果EndInvoke()被称为异步,这可能随时发生. EndInvoke更改当前的CallContext - 为什么?

此外,还有Trace.CorrelationManager,但它基于CallContext并且具有所有相同的麻烦.

有一种解决方法:使用CallContext.HostContext属性,该属性在异步操作结束时不会传播回来.此外,它没有克隆,所以值应该是不可变的 - 不是问题.虽然,它被HttpContext使用,因此,解决方法在Asp.Net应用程序中不可用.

我看到的唯一方法是将HostContext(如果不是我的)或整个LogicalCallContext包装成动态并在最后一个跟踪操作旁边调度所有调用.

.net multithreading trace operations

4
推荐指数
1
解决办法
1343
查看次数

RuntimeMethodInfo相等:bug?

让我们开始:

using System;

public class Program
{
    class A
    {
        public virtual void Do() { }
    }

    class B:A
    {
    }

    public static void Main()
    {
        var m1 = typeof(A).GetMethod("Do");
        var m2 = typeof(B).GetMethod("Do");

        Console.WriteLine("Methods are equal?\t\t{0}", m1 == m2);
        Console.WriteLine("Method handles are equal?\t{0}", m1.MethodHandle == m2.MethodHandle);

        Console.WriteLine("Done.");
        Console.ReadKey();
    }
}
Run Code Online (Sandbox Code Playgroud)

(在ideone 在线试试)

所以,有两个不相等的MethodInfo实例,都包含相同的方法句柄.这是equals运算符源:

public static bool operator ==(MethodInfo left, MethodInfo right)
{
    if (ReferenceEquals(left, right))
        return true;

    if ((object)left == null || (object)right == …
Run Code Online (Sandbox Code Playgroud)

.net c# reflection

3
推荐指数
1
解决办法
367
查看次数