这是一个代码,重现了我期望获得的行为:
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上发表了一条建议 …
我想写一个检查证明给定程序集附近有有效的pdb文件,并且存储在pdb中的校验和与源校验和匹配.
该检查过去在我们的CI服务器上被称为单元测试,以防止在构建服务器配置被破坏时发布二进制文件(例如,使用不同的git分支来构建代码).
如果可能,它应该接受MethodInfo作为输入参数.我想仔细检查并验证方法的源行是估计的.
第一部分,阅读特定方法的来源非常简单.这是一个样本.
困难的部分是检查PDB中所有文档的校验和.标准System.Diagnostics.SymbolStore.SymDocument.GetCheckSum()抛出NotImplementedException所以我肯定需要使用别的东西.
有什么建议吗?
UPD.试图澄清:)
我有兴趣检查源文件的校验和是否与存储在PDB文件中的校验和匹配,第一部分(检查pdb匹配二进制文件)已经完成.
我正在为此任务寻找一些API,因为我不想解析控制台输出.此外,我不希望在我们的CI服务器上安装任何其他SDK,因为它需要额外的时间来证明没有任何损坏.
我正在尝试将我们的解决方案从经典迁移到资源管理器部署,并且我坚持运行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文件名和模板文件名).
我的代码相似
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包装成动态并在最后一个跟踪操作旁边调度所有调用.
让我们开始:
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)