Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Visual Studio-订阅灯泡单击事件_C#_Visual Studio_Roslyn_Vsix - Fatal编程技术网

C# Visual Studio-订阅灯泡单击事件

C# Visual Studio-订阅灯泡单击事件,c#,visual-studio,roslyn,vsix,C#,Visual Studio,Roslyn,Vsix,我正在为VisualStudio开发一个代码修复程序。我有一个带有代码修复的na Analyzer项目,我已经将自动生成的Portable项目转换为标准C库项目 在我的扩展中,代码修复程序生成一个包含收集到的数据的文件,问题是,只要我悬停灯泡修复建议,文件就会生成,这就是我注册的代码修复程序执行的时候 // Register a code action that will invoke the fix. context.RegisterCodeFix( CodeAction.Creat

我正在为VisualStudio开发一个代码修复程序。我有一个带有代码修复的na Analyzer项目,我已经将自动生成的Portable项目转换为标准C库项目

在我的扩展中,代码修复程序生成一个包含收集到的数据的文件,问题是,只要我悬停灯泡修复建议,文件就会生成,这就是我注册的代码修复程序执行的时候

// Register a code action that will invoke the fix.
context.RegisterCodeFix(
     CodeAction.Create(
        title: Title,
        createChangedDocument: c => MakeDataDrivenAsync(context.Document, methodDeclaration, c),
        equivalenceKey: Title),
      diagnostic);
我希望它仅在单击接受建议时生成文件

这可能吗?
我正在考虑订阅suggestion click事件,但我不知道如何订阅,而且我还没有找到表明这是可能的信息。

只要生成预览,Roslyn API就会执行代码修复。如果您使用System.IO生成文件,那么Roslyn几乎无能为力,但是如果您创建一个新文档并使用Roslyn API添加它,则在IDE中而不是在预览中执行代码修复之前,该文件不会持久化到磁盘。请参阅需要在当前项目中创建新文档以将类型移动到其中的。很好用。 用法示例:

SourceText st = SourceText.From(csv.GetStringDocument(), Encoding.UTF8);
var additionalDoc = doc.Project.AddAdditionalDocument(filename, st, new List<string> { "_TestData" });
return additionalDoc.Project.Solution;

缺点是文件被添加到项目中,这对我来说很好。

只有当我生成的文档是代码时,才这样做,对吗?我不是真的在生成代码。但是了解它很好,非常有用如果您的代码修复程序在roslyn一无所知的文件系统上创建文件,那么您将需要编写和扩展以创建与roslyn基础设施完全断开连接的灯泡会话。请看一个例子,了解如何做到这一点。或者您可以创建一个附加文档。如果将文件添加到项目中没有问题,这是一个很好的解决方案,是的。否则,我会遇到一个类似的问题,我希望一些代码只在不在预览时执行,我提出了一个CustomCodeAction,您可以这样做。也许这有助于未来的读者了解你的解决方案是不够的。我最后也这样做了@Wolfsblvt。谢谢你写这封信。我最初没有写这篇文章,因为它不是对我最初问题的直接回答。这是最好的解决方法。是的,我也没有找到任何好的信息,这就是为什么我认为如果我发布我的解决方案会很酷,这样未来的人们会找到它,并且可以得到帮助,而不需要搜索稀疏的源数小时。