SlideShare une entreprise Scribd logo
1  sur  47
https://mvc.tw
歡迎參加我們的每週四固定聚會
1
Introduce
Source Generator
講者:Roberson Liou
https://mvc.tw
關於我
▪ 手沖咖啡科技宅
▪ Backend Engineer
▪ Microsoft MVP(2020-2021)
▪ twMVC 核心成員
▪ DevOps Taiwan 志工
▪ 工程良田的小球場
p.2
https://mvc.tw
Outline
▪Introduce Source Generator
▪How to use Source Generator?
▪Demo
3
https://mvc.tw
Introduce
Source Generator
4
https://mvc.tw
What’s the Source Generator?
▪ .NET 5 釋出的一個 Roslyn 新項目
▪ 在編譯階段產生程式碼
▪ 附加至最後的編譯結果
▪ Compile-time Meta Programing
p.5
https://mvc.tw
What CAN it do?
▪ 取得 Roslyn 編譯後的 Compilation
▪ 取得外部專案的附加檔案
▪ 取得 Config 的自定義資訊
▪ 輸出實體檔案到指定資料夾中
▪ 與 IDE 整合輸出診斷資訊
p.6
https://mvc.tw
What can NOT it do?
p.7
Source Generators: Allow embedding of files other than source #49935
▪ 不能修改原本的程式碼
▪ 無法達到 AOP 效果
▪ 可以有多個 Generator,但彼此間不能相互參考
▪ 不能產生 C# 程式碼以外的檔案
https://mvc.tw
Lifecycle - C# Compilation
C# code
Program.cs
Compile IL Code
.dll .exe
p.8
https://mvc.tw
C# code
Program.cs
Compile IL Code
.dll .exe
Invoke
Source
Generator
p.9
Lifecycle - Invoke Source Generator
https://mvc.tw
le IL
Invoke
Source
Generator
p.10
Source Generator
step of compilation
Add generated
code to compilation
Analyze
source code
Generate new
source code
Invoke Source Generator
Source Generator
Lifecycle - Source Generator
https://mvc.tw
Compile IL Code
.dll .exe
Invoke
Source
Generator
p.11
Source Generator
step of compilation
Add generated
code to compilation
Analyze
source code
Generate new
source code
Invoke Source Generator
Source Generator
C# code
Program.cs
Lifecycle - Overall
https://mvc.tw
Benefits
▪ 將 Runtime reflection 轉為 Compile-time
▪ 提升效能
▪ 處理序列化檔案
▪ .csv / .xml
▪ 擴增原始程式碼
▪ partial class / partial method
p.12
https://mvc.tw
How to use
Source Generator?
13
https://mvc.tw
執行環境
▪ .NET 5 (SDK 5.0.100)
▪ Visual Studio 2019 (16.8.0+)
▪ JetBrains Rider 2020.3 / EAP 10
p.14
https://mvc.tw
Visual Studio 2019
▪ 需手動叫用 Debugger 偵錯
▪ 可查看產生的程式碼定義
▪ 會自動標註 auto-generated
▪ 重新建置後會有快取問題,要重開 VS 才能解決
p.15
https://mvc.tw
JetBrains Rider EAP 10 / 2020.3
▪ 需透過 VS 2019 才能偵錯
▪ 可查看產生的程式碼定義
▪ 不會自動標註 auto-generated
▪ 重新建置後即可查看新的建置程式碼
p.16
https://mvc.tw
Generator 起手式
▪ 建立 .NET Standard 2.0 函式庫
▪ 安裝套件
▪ Microsoft.CodeAnalysis.CSharp (v3.8.0)
▪ Microsoft.CodeAnalysis.Analyzers (v3.3.1)
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp"
Version="3.8.0" />
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers"
Version="3.3.1" />
</ItemGroup>
p.17
https://mvc.tw
在專案中啟用 Generator
▪ 加入專案參考,需額外加入以下兩個屬性。
▪ OutputItemType="Analyzer"
▪ ReferenceOutputAssembly="false"
▪ 使用 NuGet 套件安裝 Generator 則無須另外設定。
<ItemGroup>
<ProjectReference Include="..MyGeneratorLibMyGeneratorLib.csproj"
OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
</ItemGroup>
p.18
https://mvc.tw
Generator 核心成員
▪ ISourceGenerator
▪ GeneratorAttribute
▪ GeneratorInitializationContext
▪ GeneratorExecutionContext
▪ ISyntaxReceiver
p.19
必要實作
初始
執行
篩選 Syntax
https://mvc.tw
實作 Generator
▪ 於類別掛上 [Generator]
▪ 實作 ISourceGenerator
▪ Initialize
▪ Execute
[Generator]
public class MyGenerator : ISourceGenerator
{
public void Initialize(GeneratorInitializationContext context){}
public void Execute(GeneratorExecutionContext context){}
}
p.20
https://mvc.tw
Generator - Initialize
▪ 主要成員為 GeneratorInitializationContext
▪ context 中具有一個 CancellationToken
▪ RegisterForSyntaxNotifications 可用來註冊 ISyntaxReceiver
public void Initialize
(GeneratorInitializationContext context)
{
context.RegisterForSyntaxNotifications(
() => new MySyntaxReceiver());
}
p.21
https://mvc.tw
Example - MySyntaxReceiver
public class MySyntaxReceiver : ISyntaxReceiver
{
public ClassDeclarationSyntax MyClassSyntax { get; private set; }
public void OnVisitSyntaxNode(SyntaxNode syntaxNode)
{
if (syntaxNode is ClassDeclarationSyntax classSyntax)
{
if (classSyntax.Identifier.ValueText == "MyClass")
{
MyClassSyntax = classSyntax;
}
}
}
}
p.22
[Source Generator] 使用 SyntaxReceiver 快速篩選關注的 Syntax 資訊
https://mvc.tw
Generator - Execute
▪ 主要成員為 GeneratorExecutionContext
▪ context 中具有一個 CancellationToken
▪ 從 context 取出各種 meta
▪ 依邏輯產生程式碼字串,並加到最後的編譯結果
▪ 向 IDE 回報診斷資訊
p.23
https://mvc.tw
Generator - AddSource
▪ 將要產生的程式碼加到最後的編譯結果
public void Execute(GeneratorExecutionContext context)
{
var codeText = @"namespace Sample { public class HelloWorld
{ public void Say() => Console.WriteLine(""Hello World""); }}}";
context.AddSource("HelloWorld", SourceText.From(codeText, Encoding.
UTF8));
}
p.24
https://mvc.tw
Generator - CancellationToken
▪ 在 Initial 及 Execute 中都有提供
▪ Generator 會在 IDE 的背景執行
▪ IDE 提供即時的 Intellisence
▪ 在檔案內容變更時 Generator 會被呼叫
▪ 提供 IDE 一個取消 Generator 執行的機制
▪ 可降低 CPU 使用率
p.25
[ref] When will generator be canceled?
https://mvc.tw
Example - CancellationToken
p.26
[ref] When will generator be canceled?
[Generator]
public class MyGenerator : ISourceGenerator
{
public void Initialize(GeneratorInitializationContext context)
{
if (!context.CancellationToken.IsCancellationRequested)
{
}
}
public void Execute(GeneratorExecutionContext context)
{
if (!context.CancellationToken.IsCancellationRequested)
{
}
}
}
https://mvc.tw
如何偵錯 Generator
▪ 目前無法與 IDE 自動整合
▪ 必須透過程式手動叫用偵錯器
▪ 必須手動選擇偵錯執行的 IDE 視窗
public void Initialize
(GeneratorInitializationContext context)
{
System.Diagnostics.Debugger.Launch();
}
p.27
https://mvc.tw
How to
retrieve Metadata?
28
https://mvc.tw
Meta 可以從哪裡來?
▪ Compilation
▪ SyntaxTree, SemanticModel
▪ SyntaxRecevier
▪ AddtionalFiles
▪ AnalyzerConfigOptions
p.29
https://mvc.tw
取得 Syntax 資訊
▪ 從 context.Compilation 拿到首次編譯的結果
▪ 主要對象是 Roslyn 的 Syntax API
▪ 取得 BotAttribute 的 AttributeSyntax
var syntaxNodes = compilation
.SyntaxTrees.SelectMany(s => s.GetRoot().DescendantNodes());
var attributeSyntaxs = syntaxNodes
.Where((d) => d.IsKind(SyntaxKind.Attribute)).OfType<AttributeSyntax>();
var botAttributeSyntax = attributeSyntaxs.
FirstOrDefault(x => x.Name.ToString() == "Bot");
p.30
https://mvc.tw
取得 SyntaxReceiver 資訊
▪ 從 context 取得 SyntaxRecevier 後再做轉型
public void Execute(GeneratorExecutionContext context)
{
MyClassSyntaxReceiver receiver =
(MyClassSyntaxReceiver) context.SyntaxReceiver;
var myClassSyntax = receiver.MyClassSyntax;
}
p.31
https://mvc.tw
存取附加檔案資訊
▪ 必須手動於 .csproj 裡面宣告
▪ 可於 xml 標籤內自訂屬性資訊
▪ 須明確標記為 CompilerVisibleItemMetadata
<ItemGroup>
<AdditionalFiles Include="Cars.csv" CacheObjects="true" />
<CompilerVisibleItemMetadata Include="AdditionalFiles"
MetadataName="CacheObjects" />
</ItemGroup>
Additional file transformation
p.32
https://mvc.tw
回報診斷訊息
▪ 使用 ReportDiagnostic 向 IDE 回報診斷訊息
Context.ReportDiagnostic(Diagnostic.Create(
new DiagnosticDescriptor("MYERR001", "TestDiagnostic",
$"Here is a error.", "source generator",
DiagnosticSeverity.Error, true), Location.None));
[ref] Issue Diagnostics
p.33
https://mvc.tw
將產生的程式輸出為實體檔案
▪ EmitCompilerGeneratedFiles:允許輸出檔案
▪ CompilerGeneratedFilesOutputPath:指定輸出路徑
<PropertyGroup>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<CompilerGeneratedFilesOutputPath>
$(BaseIntermediateOutputPath)GeneratedFiles
</CompilerGeneratedFilesOutputPath>
</PropertyGroup>
p.34
https://mvc.tw
如何打包成 NuGet package
▪ 設定 GeneratePackageOnBuild 為 true
▪ 設定 IncludeBuildOutput 為 false
▪ 設定 Generator 用的套件標示為 PrivateAssets="all"
▪ 設定 Generator 打包路徑於 analyzer 目錄下
[ref] Package a generator as a NuGet package p.35
https://mvc.tw
如何打包成 NuGet package
<PropertyGroup>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<IncludeBuildOutput>false</IncludeBuildOutput>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp"
Version="3.8.0" PrivateAssets="all" />
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers"
Version="3.3.1" PrivateAssets="all" />
<!-- 將 Generator 打包路徑指定在 analyzer 目錄下 -->
<None Include="$(OutputPath)$(AssemblyName).dll" Pack="true"
PackagePath="analyzers/dotnet/cs" Visible="false" />
</ItemGroup>
[ref] Package a generator as a NuGet package
p.36
https://mvc.tw
參考外部的 NuGet 套件
▪ 當套件用途為供 Generator 執行過程用時
▪ 必須設定 PrivateAssets 及 GeneratePathProperty 屬性
▪ 必須額外將 dll 打包到指定的 analyzer 目錄底下
▪ 套件名稱要改為 Pkg{PACKAGE_NAME}
▪ 遇到點(.)要改為底線 ( _ )
▪ EX: Newtonfost.Json => PkgNewtonsoft_Json
[ref] Use functionality from NuGet packages
p.37
https://mvc.tw
Example – Pack Newtonsoft.Json
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="12.0.1"
PrivateAssets="all" GeneratePathProperty="true" />
<!-- 將套件 .dll 打包路徑指定在 analyzer 目錄下 -->
<None Include="$(PkgNewtonsoft_Json)libnetstandard2.0*.dll"
Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
</ItemGroup>
[ref] Use functionality from NuGet packages
p.38
https://mvc.tw
Demo
39
https://mvc.tw
使用案例介紹
▪ Hello World
▪ DotNetBot
▪ DataBuilder
▪ CSVToList
▪ Mapper
p.40
https://github.com/robersonliou/SourceGeneratorJourney
https://mvc.tw
結語
▪ 尚未與 IDE 偵錯完全整合
▪ 繞來繞去最後還是得搞 Roslyn
▪ 寫起來很煩,用起來很爽
▪ 若要收納為團隊用途,請寫說明文件
▪ 期待 .NET 6 會推出更兇猛的功能
p.41
https://mvc.tw
補充 – Syntax 分析工具介紹
▪ SyntaxViewer (Visual Studio 2019 內建)
▪ SharpLab
▪ LinqPad
p.42
https://mvc.tw
補充 – 使用案例
▪ DataBuilder
▪ StrongInject
▪ InlineMapper
▪ 官方 Roslyn-SDK 範例
p.43
https://mvc.tw
References (Microsoft)
▪ Introducing C# Source Generators
▪ New C# Source Generator Samples
▪ Source Generators Cookbook
▪ Source Generators
p.44
Blog 是記錄知識的最佳平台
45
https://dotblogs.com.tw
46
SkillTree 為了確保內容與實務不會脫節,我們都是聘請企業顧問等級
並且目前依然在職場的業界講師,我們不把時間浪費在述說歷史與沿革,
我們並不是教您考取證照,而是教您如何上場殺敵,拳拳到肉的內容才
是您花錢想要聽到的,而這也剛好是我們擅長的。
https://skilltree.my
47
天瓏資訊圖書

Contenu connexe

Tendances (20)

APIを活用したANA版Society5.0への挑戦
APIを活用したANA版Society5.0への挑戦APIを活用したANA版Society5.0への挑戦
APIを活用したANA版Society5.0への挑戦
 
FILE SERVER
FILE SERVERFILE SERVER
FILE SERVER
 
Rajul computer presentation
Rajul computer presentationRajul computer presentation
Rajul computer presentation
 
Linux operating system - Overview
Linux operating system - OverviewLinux operating system - Overview
Linux operating system - Overview
 
Virus class 7
Virus class 7Virus class 7
Virus class 7
 
月刊NDEF 2013年2月号(臨時号)
月刊NDEF 2013年2月号(臨時号)月刊NDEF 2013年2月号(臨時号)
月刊NDEF 2013年2月号(臨時号)
 
Computer Virus
Computer VirusComputer Virus
Computer Virus
 
Internet
InternetInternet
Internet
 
[Bind DNS + Zimbra + SpamAssassin] Antispam Installation Guide
[Bind DNS + Zimbra + SpamAssassin] Antispam Installation Guide[Bind DNS + Zimbra + SpamAssassin] Antispam Installation Guide
[Bind DNS + Zimbra + SpamAssassin] Antispam Installation Guide
 
Internet and its history
Internet and its historyInternet and its history
Internet and its history
 
Unix ppt
Unix pptUnix ppt
Unix ppt
 
Mail server on linux
Mail server on linux Mail server on linux
Mail server on linux
 
Source Code Scanners
Source Code ScannersSource Code Scanners
Source Code Scanners
 
The f1 to f12 keys
The f1 to f12 keysThe f1 to f12 keys
The f1 to f12 keys
 
Internet
Internet Internet
Internet
 
Introduction to internet.
Introduction to internet.Introduction to internet.
Introduction to internet.
 
Introduction to Internet
Introduction to InternetIntroduction to Internet
Introduction to Internet
 
Network
NetworkNetwork
Network
 
Tutorial membuat hotspot mikrotik di vmware
Tutorial membuat hotspot mikrotik di vmwareTutorial membuat hotspot mikrotik di vmware
Tutorial membuat hotspot mikrotik di vmware
 
An introduction to Windows 10
An introduction to Windows 10 An introduction to Windows 10
An introduction to Windows 10
 

Similaire à twMVC#41 The journey of source generator

The Journey of Source Generator
The Journey of Source GeneratorThe Journey of Source Generator
The Journey of Source GeneratorRoberson Liou
 
ASP.NET Core 2.1設計新思維與新發展
ASP.NET  Core 2.1設計新思維與新發展ASP.NET  Core 2.1設計新思維與新發展
ASP.NET Core 2.1設計新思維與新發展江華 奚
 
Spring 2.x 中文
Spring 2.x 中文Spring 2.x 中文
Spring 2.x 中文Guo Albert
 
Introduction to CodeIgniter
Introduction to CodeIgniterIntroduction to CodeIgniter
Introduction to CodeIgniterChun-Kai Wang
 
twMVC#44 讓我們用 k6 來進行壓測吧
twMVC#44 讓我們用 k6 來進行壓測吧twMVC#44 讓我們用 k6 來進行壓測吧
twMVC#44 讓我們用 k6 來進行壓測吧twMVC
 
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit TestingASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing江華 奚
 
twMVC#38 How we migrate tfs to git(using azure dev ops)
twMVC#38 How we migrate tfs to git(using azure dev ops) twMVC#38 How we migrate tfs to git(using azure dev ops)
twMVC#38 How we migrate tfs to git(using azure dev ops) twMVC
 
twMVC#31網站上線了然後呢
twMVC#31網站上線了然後呢twMVC#31網站上線了然後呢
twMVC#31網站上線了然後呢twMVC
 
2012 php conf slide PIXNET 如何使用 php
2012 php conf slide   PIXNET 如何使用 php2012 php conf slide   PIXNET 如何使用 php
2012 php conf slide PIXNET 如何使用 phpronnywang_tw
 
使用Javascript及HTML5打造協同運作系統
使用Javascript及HTML5打造協同運作系統使用Javascript及HTML5打造協同運作系統
使用Javascript及HTML5打造協同運作系統Hsu Ping Feng
 
twMVC#42 Azure DevOps Service Pipeline設計與非正常應用
twMVC#42 Azure DevOps Service Pipeline設計與非正常應用twMVC#42 Azure DevOps Service Pipeline設計與非正常應用
twMVC#42 Azure DevOps Service Pipeline設計與非正常應用twMVC
 
twMVC 47_Elastic APM 的兩三事
twMVC 47_Elastic APM 的兩三事twMVC 47_Elastic APM 的兩三事
twMVC 47_Elastic APM 的兩三事twMVC
 
Flex 4.5 action custom component development
Flex 4.5 action custom component developmentFlex 4.5 action custom component development
Flex 4.5 action custom component developmentjexchan
 
twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸twMVC
 
Entity framework 入門第一課
Entity framework 入門第一課Entity framework 入門第一課
Entity framework 入門第一課Sean Lu
 
利用Signalr打造即時通訊@Tech day geek
利用Signalr打造即時通訊@Tech day geek利用Signalr打造即時通訊@Tech day geek
利用Signalr打造即時通訊@Tech day geekJohnson Gau
 
twMVC#43 Visual Studio 2022 新功能拆解
twMVC#43 Visual Studio 2022 新功能拆解twMVC#43 Visual Studio 2022 新功能拆解
twMVC#43 Visual Studio 2022 新功能拆解twMVC
 
OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发leneli
 
twMVC#20 | ASP.NET MVC View 開發技巧小錦囊
twMVC#20 | ASP.NET MVC View 開發技巧小錦囊twMVC#20 | ASP.NET MVC View 開發技巧小錦囊
twMVC#20 | ASP.NET MVC View 開發技巧小錦囊twMVC
 

Similaire à twMVC#41 The journey of source generator (20)

The Journey of Source Generator
The Journey of Source GeneratorThe Journey of Source Generator
The Journey of Source Generator
 
ASP.NET Core 2.1設計新思維與新發展
ASP.NET  Core 2.1設計新思維與新發展ASP.NET  Core 2.1設計新思維與新發展
ASP.NET Core 2.1設計新思維與新發展
 
Spring 2.x 中文
Spring 2.x 中文Spring 2.x 中文
Spring 2.x 中文
 
Introduction to CodeIgniter
Introduction to CodeIgniterIntroduction to CodeIgniter
Introduction to CodeIgniter
 
twMVC#44 讓我們用 k6 來進行壓測吧
twMVC#44 讓我們用 k6 來進行壓測吧twMVC#44 讓我們用 k6 來進行壓測吧
twMVC#44 讓我們用 k6 來進行壓測吧
 
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit TestingASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
 
twMVC#38 How we migrate tfs to git(using azure dev ops)
twMVC#38 How we migrate tfs to git(using azure dev ops) twMVC#38 How we migrate tfs to git(using azure dev ops)
twMVC#38 How we migrate tfs to git(using azure dev ops)
 
twMVC#31網站上線了然後呢
twMVC#31網站上線了然後呢twMVC#31網站上線了然後呢
twMVC#31網站上線了然後呢
 
2012 php conf slide PIXNET 如何使用 php
2012 php conf slide   PIXNET 如何使用 php2012 php conf slide   PIXNET 如何使用 php
2012 php conf slide PIXNET 如何使用 php
 
使用Javascript及HTML5打造協同運作系統
使用Javascript及HTML5打造協同運作系統使用Javascript及HTML5打造協同運作系統
使用Javascript及HTML5打造協同運作系統
 
twMVC#42 Azure DevOps Service Pipeline設計與非正常應用
twMVC#42 Azure DevOps Service Pipeline設計與非正常應用twMVC#42 Azure DevOps Service Pipeline設計與非正常應用
twMVC#42 Azure DevOps Service Pipeline設計與非正常應用
 
twMVC 47_Elastic APM 的兩三事
twMVC 47_Elastic APM 的兩三事twMVC 47_Elastic APM 的兩三事
twMVC 47_Elastic APM 的兩三事
 
Flex 4.5 action custom component development
Flex 4.5 action custom component developmentFlex 4.5 action custom component development
Flex 4.5 action custom component development
 
twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸
 
Entity framework 入門第一課
Entity framework 入門第一課Entity framework 入門第一課
Entity framework 入門第一課
 
利用Signalr打造即時通訊@Tech day geek
利用Signalr打造即時通訊@Tech day geek利用Signalr打造即時通訊@Tech day geek
利用Signalr打造即時通訊@Tech day geek
 
twMVC#43 Visual Studio 2022 新功能拆解
twMVC#43 Visual Studio 2022 新功能拆解twMVC#43 Visual Studio 2022 新功能拆解
twMVC#43 Visual Studio 2022 新功能拆解
 
OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发
 
Berserk js
Berserk jsBerserk js
Berserk js
 
twMVC#20 | ASP.NET MVC View 開發技巧小錦囊
twMVC#20 | ASP.NET MVC View 開發技巧小錦囊twMVC#20 | ASP.NET MVC View 開發技巧小錦囊
twMVC#20 | ASP.NET MVC View 開發技巧小錦囊
 

Plus de twMVC

twMVC#46_SQL Server 資料分析大躍進 Machine Learning Services
twMVC#46_SQL Server 資料分析大躍進 Machine Learning ServicestwMVC#46_SQL Server 資料分析大躍進 Machine Learning Services
twMVC#46_SQL Server 資料分析大躍進 Machine Learning ServicestwMVC
 
.NET 7 家族新成員: Microsoft Orleans v7
.NET 7 家族新成員:Microsoft Orleans v7.NET 7 家族新成員:Microsoft Orleans v7
.NET 7 家族新成員: Microsoft Orleans v7twMVC
 
twMVC#46 一探 C# 11 與 .NET 7 的神奇
twMVC#46 一探 C# 11 與 .NET 7 的神奇twMVC#46 一探 C# 11 與 .NET 7 的神奇
twMVC#46 一探 C# 11 與 .NET 7 的神奇twMVC
 
twMVC#44 如何測試與保護你的 web application with playwright
twMVC#44 如何測試與保護你的 web application with playwrighttwMVC#44 如何測試與保護你的 web application with playwright
twMVC#44 如何測試與保護你的 web application with playwrighttwMVC
 
twMVC#43 YARP
twMVC#43 YARPtwMVC#43 YARP
twMVC#43 YARPtwMVC
 
twMVC#43 C#10 新功能介紹
twMVC#43 C#10 新功能介紹twMVC#43 C#10 新功能介紹
twMVC#43 C#10 新功能介紹twMVC
 
twMVC#42 Azure IoT Hub for Smart Factory
twMVC#42 Azure IoT Hub for Smart FactorytwMVC#42 Azure IoT Hub for Smart Factory
twMVC#42 Azure IoT Hub for Smart FactorytwMVC
 
twMVC#42 Windows容器導入由0到1
twMVC#42 Windows容器導入由0到1twMVC#42 Windows容器導入由0到1
twMVC#42 Windows容器導入由0到1twMVC
 
twMVC#42 讓我們用一種方式來開發吧
twMVC#42 讓我們用一種方式來開發吧twMVC#42 讓我們用一種方式來開發吧
twMVC#42 讓我們用一種方式來開發吧twMVC
 
twMVC#41 hololens2 MR
twMVC#41 hololens2 MRtwMVC#41 hololens2 MR
twMVC#41 hololens2 MRtwMVC
 
twMVC#36C#的美麗與哀愁
twMVC#36C#的美麗與哀愁twMVC#36C#的美麗與哀愁
twMVC#36C#的美麗與哀愁twMVC
 
twMVC#36.NetCore 3快速看一波
twMVC#36.NetCore 3快速看一波twMVC#36.NetCore 3快速看一波
twMVC#36.NetCore 3快速看一波twMVC
 
twMVC#36讓 Exceptionless 存管你的 Log
twMVC#36讓 Exceptionless 存管你的 LogtwMVC#36讓 Exceptionless 存管你的 Log
twMVC#36讓 Exceptionless 存管你的 LogtwMVC
 
twMVC#33聊聊如何自建 Facebook {廣告} 服務 with API
twMVC#33聊聊如何自建 Facebook {廣告} 服務 with API twMVC#33聊聊如何自建 Facebook {廣告} 服務 with API
twMVC#33聊聊如何自建 Facebook {廣告} 服務 with API twMVC
 
twMVC#33玩轉 Azure 彈性部署
twMVC#33玩轉 Azure 彈性部署twMVC#33玩轉 Azure 彈性部署
twMVC#33玩轉 Azure 彈性部署twMVC
 
twMVC#32應用 ASP.NET WebAPI2 Odata 建置高互動性 APIS
twMVC#32應用 ASP.NET WebAPI2 Odata 建置高互動性 APIStwMVC#32應用 ASP.NET WebAPI2 Odata 建置高互動性 APIS
twMVC#32應用 ASP.NET WebAPI2 Odata 建置高互動性 APIStwMVC
 
twMVC#31沒有 hdd 的網站重構 webform to mvc
twMVC#31沒有 hdd 的網站重構 webform to mvctwMVC#31沒有 hdd 的網站重構 webform to mvc
twMVC#31沒有 hdd 的網站重構 webform to mvctwMVC
 
twMVC#30 | Bootstrap 搶先玩
twMVC#30 | Bootstrap 搶先玩twMVC#30 | Bootstrap 搶先玩
twMVC#30 | Bootstrap 搶先玩twMVC
 
twMVC#30 | 你應該瞭解的 container-on-azure-二三事
twMVC#30 | 你應該瞭解的 container-on-azure-二三事twMVC#30 | 你應該瞭解的 container-on-azure-二三事
twMVC#30 | 你應該瞭解的 container-on-azure-二三事twMVC
 
twMvc#30 | 技術人員與業務團隊的無礙的溝通法則
twMvc#30 | 技術人員與業務團隊的無礙的溝通法則twMvc#30 | 技術人員與業務團隊的無礙的溝通法則
twMvc#30 | 技術人員與業務團隊的無礙的溝通法則twMVC
 

Plus de twMVC (20)

twMVC#46_SQL Server 資料分析大躍進 Machine Learning Services
twMVC#46_SQL Server 資料分析大躍進 Machine Learning ServicestwMVC#46_SQL Server 資料分析大躍進 Machine Learning Services
twMVC#46_SQL Server 資料分析大躍進 Machine Learning Services
 
.NET 7 家族新成員: Microsoft Orleans v7
.NET 7 家族新成員:Microsoft Orleans v7.NET 7 家族新成員:Microsoft Orleans v7
.NET 7 家族新成員: Microsoft Orleans v7
 
twMVC#46 一探 C# 11 與 .NET 7 的神奇
twMVC#46 一探 C# 11 與 .NET 7 的神奇twMVC#46 一探 C# 11 與 .NET 7 的神奇
twMVC#46 一探 C# 11 與 .NET 7 的神奇
 
twMVC#44 如何測試與保護你的 web application with playwright
twMVC#44 如何測試與保護你的 web application with playwrighttwMVC#44 如何測試與保護你的 web application with playwright
twMVC#44 如何測試與保護你的 web application with playwright
 
twMVC#43 YARP
twMVC#43 YARPtwMVC#43 YARP
twMVC#43 YARP
 
twMVC#43 C#10 新功能介紹
twMVC#43 C#10 新功能介紹twMVC#43 C#10 新功能介紹
twMVC#43 C#10 新功能介紹
 
twMVC#42 Azure IoT Hub for Smart Factory
twMVC#42 Azure IoT Hub for Smart FactorytwMVC#42 Azure IoT Hub for Smart Factory
twMVC#42 Azure IoT Hub for Smart Factory
 
twMVC#42 Windows容器導入由0到1
twMVC#42 Windows容器導入由0到1twMVC#42 Windows容器導入由0到1
twMVC#42 Windows容器導入由0到1
 
twMVC#42 讓我們用一種方式來開發吧
twMVC#42 讓我們用一種方式來開發吧twMVC#42 讓我們用一種方式來開發吧
twMVC#42 讓我們用一種方式來開發吧
 
twMVC#41 hololens2 MR
twMVC#41 hololens2 MRtwMVC#41 hololens2 MR
twMVC#41 hololens2 MR
 
twMVC#36C#的美麗與哀愁
twMVC#36C#的美麗與哀愁twMVC#36C#的美麗與哀愁
twMVC#36C#的美麗與哀愁
 
twMVC#36.NetCore 3快速看一波
twMVC#36.NetCore 3快速看一波twMVC#36.NetCore 3快速看一波
twMVC#36.NetCore 3快速看一波
 
twMVC#36讓 Exceptionless 存管你的 Log
twMVC#36讓 Exceptionless 存管你的 LogtwMVC#36讓 Exceptionless 存管你的 Log
twMVC#36讓 Exceptionless 存管你的 Log
 
twMVC#33聊聊如何自建 Facebook {廣告} 服務 with API
twMVC#33聊聊如何自建 Facebook {廣告} 服務 with API twMVC#33聊聊如何自建 Facebook {廣告} 服務 with API
twMVC#33聊聊如何自建 Facebook {廣告} 服務 with API
 
twMVC#33玩轉 Azure 彈性部署
twMVC#33玩轉 Azure 彈性部署twMVC#33玩轉 Azure 彈性部署
twMVC#33玩轉 Azure 彈性部署
 
twMVC#32應用 ASP.NET WebAPI2 Odata 建置高互動性 APIS
twMVC#32應用 ASP.NET WebAPI2 Odata 建置高互動性 APIStwMVC#32應用 ASP.NET WebAPI2 Odata 建置高互動性 APIS
twMVC#32應用 ASP.NET WebAPI2 Odata 建置高互動性 APIS
 
twMVC#31沒有 hdd 的網站重構 webform to mvc
twMVC#31沒有 hdd 的網站重構 webform to mvctwMVC#31沒有 hdd 的網站重構 webform to mvc
twMVC#31沒有 hdd 的網站重構 webform to mvc
 
twMVC#30 | Bootstrap 搶先玩
twMVC#30 | Bootstrap 搶先玩twMVC#30 | Bootstrap 搶先玩
twMVC#30 | Bootstrap 搶先玩
 
twMVC#30 | 你應該瞭解的 container-on-azure-二三事
twMVC#30 | 你應該瞭解的 container-on-azure-二三事twMVC#30 | 你應該瞭解的 container-on-azure-二三事
twMVC#30 | 你應該瞭解的 container-on-azure-二三事
 
twMvc#30 | 技術人員與業務團隊的無礙的溝通法則
twMvc#30 | 技術人員與業務團隊的無礙的溝通法則twMvc#30 | 技術人員與業務團隊的無礙的溝通法則
twMvc#30 | 技術人員與業務團隊的無礙的溝通法則
 

twMVC#41 The journey of source generator