C #: التعريف بمولدات كود المصدر

صورة


يسعدنا أن نقدم لك معاينة لمولدات كود المصدر. هذه ميزة جديدة تسمح لمطوري C # بتحليل التعليمات البرمجية المخصصة وإنشاء ملفات C # جديدة ، والتي يمكن إضافتها بدورها إلى عملية الترجمة. يحدث هذا بمساعدة مكون جديد - Source Generator.


لتبدأ مع المولدات الكهربائية، وسوف تحتاج إلى أحدث الصافي 5 المعاينة و المعاينة البصرية ستوديو . ملاحظة: مطلوب Visual Studio لإنشاء منشئ التعليمات البرمجية المصدر. سيتم تغيير هذا في المعاينة التالية لـ .NET 5.


ما هو مولد كود المصدر؟


منشئ الشفرة المصدر هو قطعة من التعليمات البرمجية التي يتم تنفيذها أثناء التجميع ، ويتحقق من البرنامج وينشئ ملفات إضافية ، والتي يتم تجميعها بعد ذلك مع بقية التعليمات البرمجية.


فيما يلي ميزتان رئيسيتان تسمحان لك بتنفيذهما:


  • احصل على كائن تجميع يمثل كل كود المستخدم المترجم. يمكن تحليل هذا الكائن ، ويمكنك كتابة التعليمات البرمجية التي تعمل مع النماذج النحوية والدلالية للتعليمات البرمجية المترجمة ، كما هو الحال مع أجهزة التحليل الحديثة.
  • C# , . , .

. , , C# . Roslyn, , C#.


:


صورة


.NET Standard 2.0, , .NET Standard.


, .


, .


— , , , .


: , IL (IL weaving) MSBuild. .


— .NET. . .


, ASP.NET Core - , , razor . , : - , , , , . , .


— . .


, . MSBuild C# ( CSC) . , . MSBuild, , .


, — "-" (“stringly-typed”) API. , , ASP.NET Core razor. . , , .


API . -, .


Ahead-of-Time (AOT)


linker-based AOT-. , System.Text.Json, System.Text.RegularExpressions; ASP.NET Core WPF, / .


NuGet . .NET, "" ( “linkability”) AOT . OSS , .NET.


Hello World-


, .


, “Hello World” , . :


public class SomeClassInMyCode
{
    public void SomeMethodIHave()
    {
        HelloWorldGenerated.HelloWorld.SayHello(); 
        //  Console.WriteLine("Hello World!")     
    }
}

, :


1. .NET.


<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <LangVersion>preview</LangVersion>
  </PropertyGroup>

  <PropertyGroup>
    <RestoreAdditionalProjectSources>https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json ;$(RestoreAdditionalProjectSources)</RestoreAdditionalProjectSources>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="3.6.0-3.20207.2" PrivateAssets="all" />
    <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.0.0-beta2.final" PrivateAssets="all" />
  </ItemGroup>

</Project>

2. C#, .


using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Text;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml;

namespace MyGenerator
{
    [Generator]
    public class MySourceGenerator : ISourceGenerator
    {
        public void Execute(SourceGeneratorContext context)
        {
            // TODO -     
        }

        public void Initialize(InitializationContext context)
        {
             //     
        }
    }
}

Microsoft.CodeAnalysis.Generator Microsoft.CodeAnalysis.ISourceGenerator.


3. .


using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Text;

namespace SourceGeneratorSamples
{
    [Generator]
    public class HelloWorldGenerator : ISourceGenerator
    {
        public void Execute(SourceGeneratorContext context)
        {

            // ,       
            var sourceBuilder = new StringBuilder(@"

using System;
namespace HelloWorldGenerated
{
    public static class HelloWorld
    {
        public static void SayHello() 
        {
            Console.WriteLine(""   !"");
            Console.WriteLine(""       "");
");

           //  ,       
            var syntaxTrees = context.Compilation.SyntaxTrees;
            //        ,   
            foreach (SyntaxTree tree in syntaxTrees)
            {
                sourceBuilder.AppendLine($@"Console.WriteLine(@"" - {tree.FilePath}"");");
            }
            //   
            sourceBuilder.Append(@"
        }
    }
}");
            //      
            context.AddSource("helloWorldGenerator", SourceText.From(sourceBuilder.ToString(), Encoding.UTF8));
        }

        public void Initialize(InitializationContext context)
        {
              //     
        }
    }
}

4. LangVersion .


<!--        -->
<PropertyGroup>
  <LangVersion>preview</LangVersion>
</PropertyGroup>

<!--   ItemGroup,       -->
<ItemGroup>
<!--   ,    "" ProjectReference. 
   'OutputItemType'  'ReferenceOutputAssmbly'. -->
    <ProjectReference Include="path-to-sourcegenerator-project.csproj" 
                      OutputItemType="Analyzer"
                      ReferenceOutputAssembly="false" />
</ItemGroup>

Roslyn, .


Visual Studio , . , :


public class SomeClassInMyCode
{
    public void SomeMethodIHave()
    {
        HelloWorldGenerated.HelloWorld.SayHello(); 
        //  Console.WriteLine("Hello World!")     
    }
}

: Visual Studio, IntelliSense


:


  • , , INotifyPropertyChanged,
  • , SourceGeneratorContext,
  • JSON- . .

Source Generators Cookbook.
GitHub.


, — , IntelliSense , Visual Studio.



. — . API . C# 9, API , .


C# : ! .NET , C# – . , - .


:



, .



Visual Studio , “ 1.0”. , . .NET 5 . , API, - OSS.


. , . .


FAQ


, . .


— , ?


— , , , . , . , , . , - , .


F#?


F#. . , F# , . — , C#, , C# .


?


. — . “”, . .


?


, . , , . C#, . -.


/ ?


. , / . , C#.


?


C# 9. , .


TFM ?


. .NET Standard 2.0 TFM . .NET Standard 2.0.


Visual Basic F#?


#. , . VB . F# — .


?


, . VB F# , , . . . , , .


Intellisense ? Visual Studio , ?


Visual Studio. . Visual Studio .


Visual Studio?


Visual Studio.


?


NuGet, , . .


Microsoft ?


. . , Microsoft .


LangVersion ?


على الرغم من أن مولدات كود المصدر ليست من الناحية الفنية ميزة لغة C # ، إلا أنها في المعاينة. بدلاً من تقديم إعداد جديد لهم فقط ، قررنا أنه سيكون من الأسهل استخدام المحول الحالي ، والذي يسمح لك بعرض ميزات اللغة لمترجم C #.


All Articles