Estoy tratando de construir un generador de fuentes. En este momento, solo el método estático más básico que devuelve "Hello World".
El proyecto del generador se compila, pero el código generado no está disponible, el depurador nunca se inicia y el resultado de la compilación muestra
CSC: advertencia CS8032: no se puede crear una instancia del analizador Generator.StaticPropertyEnum.helloWorld desde ...\bin\Debug\net5.0\Generator.StaticPropertyEnum.dll: no se pudo cargar el archivo o ensamblado 'System.Runtime, Version=5.0 .0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' o una de sus dependencias. El sistema no puede encontrar el archivo especificado..
Microsoft.CodeAnalysis.CSharp y Microsoft.CodeAnalysis.AnalyzersMicrosoft.Net.Compilers.Toolset Visual Studio: versión 16.8.3
SDK de .NET: 5.0.101
Generador.csproj
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net5.0</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.9.0-2.final" PrivateAssets="all" /> <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.0.0" PrivateAssets="all" /> </ItemGroup> </Project>Probar csproj
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net5.0</TargetFramework> <IsPackable>false</IsPackable> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.7.1" /> <PackageReference Include="xunit" Version="2.4.1" /> <PackageReference Include="xunit.runner.visualstudio" Version="2.4.3"> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <PrivateAssets>all</PrivateAssets> </PackageReference> <PackageReference Include="coverlet.collector" Version="1.3.0"> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <PrivateAssets>all</PrivateAssets> </PackageReference> </ItemGroup> <ItemGroup> <ProjectReference Include="..\Generator.StaticPropertyEnum\Generator.StaticPropertyEnum.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false"/> </ItemGroup> </Project>Generador
[Generator] public class helloWorld : ISourceGenerator { public void Execute(GeneratorExecutionContext context) { context.AddSource("HelloWorld-generated.cs", @" using System; namespace HelloWorld { public static class Hello { public static string SayHello() { return ""HelloWorld""; } } }"); } public void Initialize(GeneratorInitializationContext context) { #if DEBUG if(!Debugger.IsAttached) Debugger.Launch(); #endif } }como @Yair-Halberstadt mencionó en una respuesta diferente, el error específico enumerado se debe al hecho de que actualmente los proyectos de generación de fuentes deben apuntar a netstandard2.0. Sin embargo, si obtiene el error CS8032 con un ensamblado diferente (por ejemplo Microsoft.CodeAnalysis, Version=3.0.x ... ), su problema probablemente se deba a una discrepancia en la versión del SDK. Por ejemplo, en mi computadora tengo SDK 5.0.302 que tiene la versión 3.10.0 de Microsoft.CodeAnalysis y Microsoft.CodeAnalysis.CSharp . Si bien el proyecto Generator usa nuget para obtener estos paquetes, la compilación del proyecto que hace referencia al generador resuelve estos archivos desde el SDK. Es por eso que volver a 3.8.0 ha funcionado para algunos comentaristas, la versión SDK que han instalado contiene 3.8.0 de estas referencias.
Tuve que cambiar de 4.0.0 a 3.9 CodeAnalysis Sharp and Analyzers.
Los generadores de código fuente deben ser .NET Standard 2.0 para ejecutarse en Visual Studio 2019+ o .NET Standard 1.x para ejecutarse en Visual Studio 2017+.
Tengo un generador de fuentes que apunta a netstandard2.0 y net5.0 para soporte de nulabilidad.
<TargetFrameworks>net5.0;netstandard2.0</TargetFrameworks> <Nullable>enable</Nullable>y una biblioteca de muestra que apunta a los mismos marcos.
Se bloquea cuando el proyecto se está compilando dentro de Visual Studio, pero se compila correctamente desde la terminal.
Para resolver esto, cambié el marco de destino al hacer referencia a él como un generador con SetTagetFramework y ahora se compila sin advertencias ni errores.
<ItemGroup> <ProjectReference Include="..\MyGenerator\MyGenerator.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" SetTargetFramework="TargetFramework=netstandard2.0" /> </ItemGroup>