国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C# 源代碼生成器

這篇具有很好參考價值的文章主要介紹了C# 源代碼生成器。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

什么是源生成器

源生成器是由.NET Compiler Platform(“Roslyn”)SDK 附帶。
通過源生成器,C# 開發(fā)人員可以在編譯用戶代碼時檢查用戶代碼。 生成器可以動態(tài)創(chuàng)建新的 C# 源文件,這些文件將添加到用戶的編譯中。 這樣,代碼可以在編譯期間運(yùn)行。 它會檢查你的程序以生成與其余代碼一起編譯的其他源文件。

  • 源生成器是 C# 開發(fā)人員可以編寫的一種新組件

源生成器允許執(zhí)行兩個主要操作

1、檢索表示正在編譯的所有用戶代碼的編譯對象。 可以檢查此對象,并且可以編寫適用于正在編譯的代碼的語法和語義模型的代碼,就像現(xiàn)在使用分析器一樣。

2、生成可在編譯過程中添加到編譯對象的 C# 源文件。 也就是說,在編譯代碼時,可以提供其他源代碼作為編譯的輸入。

結(jié)合使用這兩項操作能充分發(fā)揮源生成器的強(qiáng)大功能。 可以使用編譯器在編譯時構(gòu)建的豐富元數(shù)據(jù)檢查用戶代碼。 然后,生成器將 C# 代碼發(fā)送回基于已分析數(shù)據(jù)的同一編譯。 如果你熟悉 Roslyn 分析器,可以將源生成器視為可發(fā)出 C# 源代碼的分析器。

Microsoft 文檔模型圖示

源生成器作為編譯階段運(yùn)行
C# 源代碼生成器

源生成器是由編譯器與任何分析器一起加載的 .NET Standard 2.0 程序集。 它在可以加載和運(yùn)行 .NET Standard 組件的環(huán)境中使用。

目前只有 .NET Standard 2.0 程序集可以用作源生成器。

常見方案

  • 運(yùn)行時反射
  • 處理 MSBuild 任務(wù)
  • 交織中間語言 (IL)

可用于檢查用戶代碼,并基于當(dāng)今技術(shù)所使用的分析生成信息或代碼。
詳細(xì)內(nèi)容參考Microsoft 文檔

源生成器的使用

1、創(chuàng)建 .NET控制臺應(yīng)用程序

不使用頂級語句, 經(jīng)典格式是必需的

強(qiáng)行使用頂級語句會報:
錯誤 CS0759 沒有為分部方法“Program.HelloFrom(string)”的實現(xiàn)聲明找到定義聲明
方法未聲明的錯誤

namespace SourceCodeConsole
{
    public partial class Program
    {
        static void Main(string[] args)
        {
            HelloFrom("Generated Code");
        }
        static partial void HelloFrom(string name);
    }
}

2、創(chuàng)建源生成器項目

引入NuGet包:
Microsoft.CodeAnalysis.CSharp
Microsoft.CodeAnalysis.Analyzers

繼承 ISourceGenerator 并實現(xiàn)接口方法,也要為實現(xiàn)類添加[Generator]特性支持

using Microsoft.CodeAnalysis;
using System.Diagnostics;

namespace HelloSourceCode
{
    [Generator]
    public class HelloSourceGenerator : ISourceGenerator
    {
        public void Execute(GeneratorExecutionContext context)
        {
            // 找到主方法
            var mainMethod = context.Compilation.GetEntryPoint(context.CancellationToken);

            // 構(gòu)建源代碼
            string source = $@"http:// <auto-generated/>
using System;

namespace {mainMethod.ContainingNamespace.ToDisplayString()}
{{
    public static partial class {mainMethod.ContainingType.Name}
    {{
        static partial void HelloFrom(string name) =>
            Console.WriteLine($""Generator says: Hi from '{{name}}'"");
    }}
}}
";
            var typeName = mainMethod.ContainingType.Name;
            // 將源代碼添加到編譯中
            context.AddSource($"{typeName}.g.cs", source);
        }

        public void Initialize(GeneratorInitializationContext context)
        {
            // 不需要初始化

            // 附加調(diào)試器進(jìn)程
            //if (!Debugger.IsAttached)
            //{
            //    Debugger.Launch();
            //}
        }
    }
}

context 對象中,我們可以訪問編譯的入口點(diǎn)或 Main 方法。 mainMethod 實例是一個 IMethodSymbol,它表示一個方法或類似方法的符號(包括構(gòu)造函數(shù)、析構(gòu)函數(shù)、運(yùn)算符或?qū)傩?事件訪問器)。 Microsoft.CodeAnalysis.Compilation.GetEntryPoint 方法返回程序的入口點(diǎn)的 IMethodSymbol。 其他方法使你可以查找項目中的任何方法符號。 在此對象中,我們可以推理包含的命名空間(如果存在)和類型。 此示例中的 source 是一個內(nèi)插字符串,它對要生成的源代碼進(jìn)行模板化,其中內(nèi)插的缺口填充了包含的命名空間和類型信息。 使用提示名稱將 source 添加到 context。 對于此示例,生成器創(chuàng)建一個新的生成的源文件,其中包含控制臺應(yīng)用程序中 partial 方法的實現(xiàn)。 可以編寫源生成器來添加任何喜歡的源。

GeneratorExecutionContext.AddSource 方法中的 hintName 參數(shù)可以是任何唯一名稱。 通常為該名稱提供顯式 C# 文件擴(kuò)展名,例如 ".g.cs"".generated.cs"。 該文件名有助于將文件標(biāo)識為正在生成源。

關(guān)于 Initialize 方法一般是不用初始化的,上面可以看到我是寫了一段代碼的,作用是進(jìn)入調(diào)試,這樣做的主要原因是,不進(jìn)行附加是無法進(jìn)行調(diào)試的

3、在控制臺程序中使用生成器項目

<ItemGroup>
    <ProjectReference Include="..\HelloSourceCode\HelloSourceCode.csproj"
                      OutputItemType="Analyzer"
                      ReferenceOutputAssembly="false" />
</ItemGroup>

新引用不是傳統(tǒng)的項目引用,必須手動編輯以包含 OutputItemType 和 ReferenceOutputAssembly 屬性。

  • 運(yùn)行結(jié)果
    C# 源代碼生成器

  • 查看生成的代碼
    C# 源代碼生成器

結(jié)語

本文學(xué)術(shù)內(nèi)容皆引用于 Microsoft 文檔
部分詳細(xì)內(nèi)容,本篇不再說明,Microsoft 文檔說得很明確:文檔地址
https://learn.microsoft.com/zh-cn/dotnet/csharp/roslyn-sdk/文章來源地址http://www.zghlxwxcb.cn/news/detail-442531.html

到了這里,關(guān)于C# 源代碼生成器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 淘寶無痕下單生成器一拖多入口生成器(附api生成接口以代碼)

    淘寶無痕下單生成器一拖多入口生成器(附api生成接口以代碼)

    淘寶無痕下單生成器的用途是:通過無痕下單生成器生成的二維碼,用戶通過掃碼直接無痕下單的,電商后臺只顯示成交,但是沒有路徑,什么都沒有,沒有痕跡,即使通過淘寶生意參謀流量路徑、訪客人數(shù)等數(shù)據(jù)都無法顯示。可快速帶動搜索權(quán)重,獲得

    2024年02月12日
    瀏覽(179)
  • css在線代碼生成器

    css在線代碼生成器

    這里收集了許多有意思的css效果在線代碼生成器適合每一位前端開發(fā)者 網(wǎng)格生成器https://cssgrid-generator.netlify.app/ CSS Grid Generator可幫助開發(fā)人員使用CSS Grid創(chuàng)建復(fù)雜的網(wǎng)格布局。網(wǎng)格布局是創(chuàng)建Web頁面的靈活和響應(yīng)式設(shè)計的強(qiáng)大方式。 布局生成器https://layout.bradwoods.io/ CSS布局生

    2024年02月14日
    瀏覽(100)
  • MyBatisPlus代碼生成器使用

    MyBatisPlus代碼生成器使用

    無侵入 :只做增強(qiáng)不做改變,引入它不會對現(xiàn)有工程產(chǎn)生影響,如絲般順滑 損耗小 :啟動即會自動注入基本 CURD,性能基本無損耗,直接面向?qū)ο蟛僮?強(qiáng)大的 CRUD 操作 :內(nèi)置通用 Mapper、通用 Service,僅僅通過少量配置即可實現(xiàn)單表大部分 CRUD 操作,更有強(qiáng)大的條件構(gòu)造器,

    2024年02月03日
    瀏覽(97)
  • 源生成器:根據(jù)需要自動生成機(jī)械重復(fù)代碼

    本文概述了利用.NET Compiler Platform(“Roslyn”)SDK 附帶的 源生成器 (Source Generator)自動生成機(jī)械重復(fù)的代碼。關(guān)于這部分的基礎(chǔ)入門知識可以在MSDN [1] 學(xué)到。 本文 默認(rèn) 已經(jīng)有一個解決方案,包含兩個項目。一個是普通C#項目,依賴于另一個源生成器項目。 此處以 Dependenc

    2024年02月01日
    瀏覽(95)
  • Java-代碼生成器的實現(xiàn)

    Java-代碼生成器的實現(xiàn)

    最近看了一個開源的項目, jfinal-layui ,然后這個項目里面有一個 代碼生成器 的功能 之前雖然有用過代碼生成器,但是從來沒有看過相關(guān)的源碼,所以就研究了一下,個人感覺這個項目的代碼生成器還是蠻好的,能夠根據(jù)指定的數(shù)據(jù)庫和表生成前后端的代碼,不過這個項目

    2024年02月02日
    瀏覽(94)
  • 【若依】-代碼生成器-微服務(wù)版本

    【若依】-代碼生成器-微服務(wù)版本

    代碼生成器可以快速的構(gòu)建單表的CRUD操作,甚至提供了前端,可謂良心 說明:我默認(rèn)你已經(jīng)部署了微服務(wù)版本的若依項目,并將前后端已經(jīng)運(yùn)行 下面的內(nèi)容是關(guān)于-單表CRUD-的代碼生成器使用步驟 這里的表可以直接從若依的官網(wǎng)拿,改表名就可以,改一下表名,導(dǎo)入數(shù)據(jù)庫

    2024年02月04日
    瀏覽(94)
  • 若依筆記(四):代碼生成器

    若依筆記(四):代碼生成器

    已知使用MyBatisPlus代碼生成器可以自動生成Entity、Mapper、Service、Controller代碼,前提是數(shù)據(jù)庫中有數(shù)據(jù)表,生成pojo類以及對于該數(shù)據(jù)表的增刪改查命令的代碼,若依更進(jìn)一步能選擇表后生成代碼、預(yù)覽、下載,同時可以生產(chǎn)前端代碼,與后端一起還能實現(xiàn)權(quán)限管理和數(shù)據(jù)隔離

    2024年02月06日
    瀏覽(89)
  • 又一款低代碼生成器

    大家好,我是 Java陳序員 。 最近在瀏覽 Github 的時候,發(fā)現(xiàn)了一款簡單好用的低代碼生成器 maku-generator 。 無論是工作,還是接私活,這款低代碼都能快速迭代出一個項目! 今天,分享給大家,強(qiáng)烈建議私有化部署! 關(guān)注微信公眾號:【Java陳序員】,獲取 開源項目分享、

    2024年04月10日
    瀏覽(91)
  • 基于Velocity開發(fā)代碼生成器

    基于Velocity開發(fā)代碼生成器

    一、引言 在項目開發(fā)中,我們有碰到大量的簡單、重復(fù)的增刪改查需求,通過閱讀 若依 框架https://github.com/yangzongzhuan/RuoYi?的代碼生成器實現(xiàn),結(jié)合我項目所用的技術(shù)棧,開發(fā)出本項目的代碼生成器。 二、Velocity?簡單介紹 1、Velocity是一個基于Java的模板引擎,我們可以往C

    2024年02月15日
    瀏覽(90)
  • Vform低代碼表單、表單生成器

    Vform - 讓表單開發(fā)變得簡單Vform 是一個基于 Vue.js 的前端表單生成器,使用它可以通過可視化拖拽的方式快速構(gòu)建出功能完備的表單。相比手寫模板代碼,它可以大大提高表單開發(fā)的效率和體驗。 Vform 的主要特性如下: 拖拽布局:通過鼠標(biāo)拖拽可以隨意布置各種表單控件,無需編寫

    2024年02月16日
    瀏覽(85)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包