【问题标题】:How to debug into attribute code that is from nuget?如何调试来自nuget的属性代码?
【发布时间】:2017-07-19 10:51:50
【问题描述】:

设置

我创建了一个带有属性的方法。我已经将属性打包到一个 nuget 包(调试符号模式)中,就像我想调试到 nuget 包时一样。

问题

我怎样才能进入这个属性?我需要在我的属性代码中加入一些其他的“进入这个”属性吗?我只找到了 stops 我的调试 DebuggerStepThroughAttribute 的属性,但没有任何东西可以让我在调试时显式停止(当然你通常不需要)。

我希望我已经解释得足够清楚了。

编辑(更多信息)

Jordan 建议在方法中调用 GetCustomAttributes,但这不是一个选项(至少在我的情况下)。我的属性正在对 API 调用进行令牌验证,因此如果属性中的代码拒绝访问,则不允许您 (401) 进入该方法。而且我不能在 nuget 包中设置刹车点,我需要能够进入该代码。

编辑 2(终于...代码)

所以终于有代码了。我不认为我需要一个,但我们在这里:-)。

我已经实现了我自己的属性(你可以这样做),其中有我希望能够调试的代码。

public class TokenAuthenticate : ActionFilterAttribute, IAuthenticationFilter
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {

        base.OnActionExecuting(actionContext);
    }

    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        base.OnActionExecuted(actionExecutedContext);
    }

    public bool AllowMultiple => true;

    public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
    {
      //... where I want to debug into
    }
}

然后这个属性就在这样的方法或类上 [TokenAuthenticate ]

【问题讨论】:

  • 属性是装饰,不会在没有反射的情况下改变执行。您正在使用什么属性并且您是否正确使用它?如果您只是尝试在没有相关框架的情况下实例化装饰类,则不会发生任何事情。
  • @MatthewWhited 我用代码更新了这个问题。我很确定我使用正确。做了很长时间,但从来没有在 nuget 包中包含我的属性,需要调试代码。如果我只是将 nuget 项目导入到我的解决方案中,我可以很好地调试。

标签: c# .net custom-attributes


【解决方案1】:

根据MSDNAttributes被延迟实例化:

需要注意的是,这些 Attribute 对象是实例化的 懒洋洋。也就是说,在您使用之前它们不会被实例化 GetCustomAttribute 或 GetCustomAttributes。它们也被实例化 每一次。连续两次调用 GetCustomAttributes 将返回两个 ObsoleteAttribute 的不同实例。

如果您需要进入它们,您应该可以通过在相关类型上调用GetCustomAttributes 并在Attribute 内放置一个断点来执行此操作。

【讨论】:

  • 我不太关注。您希望我在哪里调用 GetCustomAttributes?如果我在具有迟到属性的方法中这样做。我会更新我的问题以反映这一点。
  • @Sturla 看看上面的代码,有没有一个控制器可以设置一个断点,然后尝试从那里单步执行?
  • 有一个控制器,它在顶部有这个属性,即使我从构造函数中按 F11,我也从未点击过属性代码。我更加确定 nuget 包是在调试中构建的。
  • 在控制器类之上?你能把断点放在控制器上一个动作的末尾,然后单步执行执行的动作吗?
【解决方案2】:

就我而言,我必须调试我创建的自定义属性。我找到了一个特殊的解决方案,但它对我有用。

您可以将构造函数添加到您的 TokenAuthenticate 类并从您的 Startup.cs 调用它,例如,如果您正在使用 WebApi。

        public void Configure(...)
        {
            
#if DEBUG
            // Hack to debug your custom attribute, put a breakpoint here
            var myVar = new TokenAuthenticate ();
#endif

然后您可以在您的 Web 项目启动时进入构造函数...并且当您的 TokenAuthenticate 类的代码出现时,您可以在您希望调试器停止的位置放置一个断点。

如果您在自己的 nuget 包中有自定义属性。您可以将 PDB 文件包含到您生成的 nuget 包中,此设置位于用于生成 de nupkg 的 *.csproj 文件中。

<IncludeSymbols>true</IncludeSymbols>

我希望这对你和纯度诽谤者有用,不要生我的气。

参考:Including pdb files into nupkg

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 2015-04-15
    • 2011-05-23
    • 2021-04-19
    相关资源
    最近更新 更多