C# 源生成器诊断文档页链接

C# Source Generator diagnostic documentation page link

提问人:user3797758 提问时间:11/30/2022 最后编辑:user3797758 更新时间:11/20/2023 访问量:128

问:

我编写了一个创建错误的源代码生成器,我希望能够通过访问文档页面为用户提供有关他们遇到的特定错误的更多信息。

幸运的是,DiagnosticDescriptor 有一个字段,描述如下:helpLinkUri

一个可选的超链接,提供有关诊断的更详细描述。

但是当我尝试通过设置为像 这样的测试网站来使用它时,或者我被发送到 https://learn.microsoft.com/en-us/visualstudio/ide/not-in-toc/default 这不是我设置的。这是在使用 Visual Studio 并在错误面板中单击错误代码时。helpLinkUrigoogle.comhttp://google.comhttps://google.comwww.google.com

如何打开用于源生成器诊断的自定义网页?是否有任何文档未提及的限制?这是 Visual Studio 中存在的限制吗?

代码示例:

private static void ErrorMessage(SourceProductionContext _arg1, AttributeSourceWithContext _arg2)
{
    DiagnosticDescriptor errorType = new DiagnosticDescriptor(
        id: "Error1",
        title: "Incorrect line",
        messageFormat: "This is complex, open help link for good explanation",
        helpLinkUri: "google.com", // <----- this is not opened when inspecting the error
        defaultSeverity: DiagnosticSeverity.Warning,
        isEnabledByDefault: true);

    Diagnostic errorInstance = Diagnostic.Create(errorType, _arg2.GetLocation());
    _arg1.ReportDiagnostic(errorInstance);
}
C# 可视化工作室 roslyn-code-analysis 源生成器 csharp-source-generator

评论

0赞 wenbingeng-MSFT 12/1/2022
您能否分享有关目标页面重定向不准确的更多信息?例如,此模块的密钥代码。
1赞 user3797758 12/2/2022
@wenbingeng-MSFT 我不明白这个问题。如果我提供了帮助 url 并打开了错误的帮助,我会被发送到问题的 Microsoft 网站,而不是我指示为具有错误帮助信息的网站。Google.com
0赞 wenbingeng-MSFT 12/5/2022
只有在程序运行错误后,才会弹出此页面。根据您的描述,代码可能存在问题。可以分享您的一些代码吗?
1赞 user3797758 3/11/2023
@wenbingeng-MSFT 它不是在执行期间,我希望在双击 Visual Studios“错误列表”窗格中的错误消息时打开该页面。如果您单击错误代码“Error1”(在示例中),我希望浏览器会像示例一样打开为“google.com”,但事实并非如此。这是我的代码,因为它是一个自定义代码生成器,所以我希望能够定向到我自己的域,而不是 MSDN。
0赞 Rich Armstrong 6/24/2023
我看到了同样的不当行为。我的代码生成器对修饰枚举成员的属性感兴趣。如果我的 CG 诊断出属性格式不正确,则该属性下方会显示红色或蓝色波浪线,正如预期的那样。如果用户将鼠标悬停在波浪线上,则会出现一个工具提示,其中包含来自 DiagnosticDescriptor 的预期诊断文本(ID 和说明),例如“AS101 foo 属性被搞砸了”。如果描述符的 helpLinkUri 指定 URI,则 AS101 将是工具提示中的链接,并将导航到预期的站点。但是“错误列表”面板中的 AS101 将导航到 MS 站点。

答:

1赞 RatzMouze 11/20/2023 #1

我也有同样的问题。
还有一种链接将写在消息后面的“说明”列中。如果单击它,Visual Studio 将崩溃。

正如你可能知道的那样,在 Visual Studio 中使用源生成器时,它们并不总是按照编码的方式运行。
不要害怕——

尝试清理解决方案,生成,重启 Visual Studio,然后 重新生成解决方案。

这些是编码源生成器的四骑士。

第一次构建或重建时,将发生生成器的某种缓存。
您有时会注意到这一点,如果您开始编码并在生成器中编辑 LiteralString 值,则最终文档中的更改并不总是立即发生。
但是,在生成器所针对的文件中进行编辑,几乎会立即更改最终结果 - 当然,当生成器工作时。

最后,我让它使用:

new DiagnosticDescriptor(
    "ErrorCodeXXXX", 
    "Dumb code title", 
    "The code right here is dumb and dont always work as intended.", 
    "DumbFeatureError", 
    DiagnosticSeverity.Error, 
    true, 
    helpLinkUri: "https://DocLink.Domain/InternalDoc")

编辑: 现在我再次查看您的代码,也可能是因为您的 URL 中没有“https://”。

评论

0赞 user3797758 11/21/2023
我在代码示例上方提到了我尝试过的域样式,其中包括前缀,所以我认为这不是解决方法。可能是 VS 更新已经修复了它?我用了 17.4.5https://
0赞 RatzMouze 11/21/2023
我不知道任何更新。我只能说我遇到了同样的问题(和其他问题),但是在“清洁、构建、重新启动和重建”之后,它对我有用。