我按照文档创建了一个基本的增量源生成器,它输出标有属性的类的副本:
// Code found in my project
[Copy]
public class MyClass
{
public int Value { get; set; }
}
// Output from the source generator
public class Copy_MyClass
{
public int Value { get; set; }
}
源代码生成本身工作得很好,但是在将它与 Visual Studio 2022 一起使用时遇到了两个问题:
- 源代码生成器仅在构建期间执行。
- 在我重新启动 Visual Studio 之前,Intellisense 不会获取生成的代码。
- 我可以通过将生成的源文件写入项目目录来解决这个问题,但这并不理想,并且仍然受到上述问题的影响:在我尝试构建之前,更改不会反映出来。
例如,如果我Foo
使用 [Copy] 属性创建一个新类,然后尝试Copy_Foo
在我的代码中引用,Visual Studio 将显示一个Copy_Foo
未定义的错误。
[Copy]
public class Foo { }
public static class TestCopy
{
public static void Test()
{
Copy_Foo foo = new Copy_Foo();
// ^^^^^^^^
// The type or namespace 'Copy_Foo' could not be found
}
}
构建此代码将成功,但 Visual Studio 将继续认为Copy_Foo
不存在。一旦我重新启动,它就会知道它的Copy_Foo
存在,但是在我再次重新启动之前,它的任何更改都不会被拾取。
我创建了一个小示例,它仅输出 [Copy] 属性。
第一个项目包含源生成器:
// TestSourceGenerator.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<IncludeBuildOutput>false</IncludeBuildOutput>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.3">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.0.1" />
</ItemGroup>
<ItemGroup>
<None Include="$(OutputPath)\$(AssemblyName).dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
</ItemGroup>
</Project>
// TestSourceGenerator.cs
using System.Text;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Text;
namespace TestSourceGenerator
{
[Generator]
public class TestSourceGenerator : IIncrementalGenerator
{
private const string CopyAttributeSource = @"
namespace Generated
{
public class CopyAttribute : System.Attribute { }
}";
public void Initialize(IncrementalGeneratorInitializationContext context)
{
context.RegisterPostInitializationOutput(ctx => ctx.AddSource("CopyAttribute.g.cs", SourceText.From(CopyAttributeSource, Encoding.UTF8)));
}
}
}
第二个消耗生成器:
// TestSourceGenerator.Test.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Library</OutputType>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\TestSourceGenerator\TestSourceGenerator.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
</ItemGroup>
</Project>
// MyClass.cs
namespace TestSourceGenerator.Test
{
[Generated.CopyAttribute]
public class MyClass
{
}
}
如果创建没有 的 TestSourceGenerator.Test 项目ProjectReference
,在 Visual Studio 中打开它,然后编辑项目文件以引用分析器,你会看到 Visual Studio 在 上显示错误[Generated.CopyAttribute]
,但项目构建成功。
有什么方法可以让 Visual Studio 在 IDE 中运行我的源代码生成器并从生成的代码中获取符号?根据文档,这似乎应该是一个受支持的用例,甚至是增量源生成器存在的主要动机之一。