← முகப்பு

ஒரு WinForms பயன்பாட்டை இடம்பெயர்த்தல்

ஏற்கனவே உள்ள Windows Forms தீர்வை (solution) தானியங்கி மீள்எழுத்தின் மூலம் Majorsilence.Forms இற்கு நகர்த்துங்கள் — அல்லது படிப்படியாக, ஒரு நேரத்தில் ஒரு படிவம் அல்லது ஒரு கட்டுப்பாடு என நகர்த்துங்கள்; அதுவரை மீதமுள்ளவை உண்மையான WinForms அல்லது WPF உடன் தொடர்ந்து build ஆகும்.

இந்தப் பக்கம் ஒரு மொழிபெயர்ப்பு. ஆங்கிலப் பதிப்புடன் வேறுபாடு இருந்தால், ஆங்கிலப் பதிப்பே சரியானது. English

ஒரு WinForms பயன்பாட்டை XAML framework ஒன்றுக்கு இடம்பெயர்த்தல் என்றால் ஒவ்வொரு திரையையும் மீண்டும் கட்டியெழுப்புவதாகும். அதை Majorsilence.Forms இற்கு இடம்பெயர்த்தல் பெரும்பாலும் ஒரு இயந்திரத்தனமான மீள்எழுத்து (mechanical rewrite) — அதே படிவங்கள், அதே கட்டுப்பாடுகள், அதே நிகழ்வு கையாளிகள் (event handlers), வேறொரு namespace ஐ நோக்கி மாற்றப்பட்டவை — அதை உங்களுக்காகச் செய்யும் ஒரு CLI உம் உள்ளது.

dotnet tool install -g Majorsilence.Forms.Migrator
majorsilence-migrate MySolution.sln --dry-run --diff

முழுமையான குறிப்பு repository இல் உள்ள MIGRATION.md ஆகும். இந்தப் பக்கம் ஒரு அறிமுக வழிகாட்டி மட்டுமே.

கருவியை நிறுவுதல்

Migrator, nuget.org இல் ஒரு .NET tool ஆக வெளியிடப்படுகிறது; இப்போது அது வெளியிடப்படும் ஒரே வடிவம் இது மட்டுமே — முன்பு releases ஒவ்வொரு தளத்துக்கும் ஒரு self-contained single-file binary ஐயும் இணைத்தன; இப்போது அப்படிச் செய்வதில்லை. அதாவது கணினியில் ஒரு .NET runtime தேவை (package RollForward=latestMajor உடன் net10.0 ஐ இலக்காகக் கொள்கிறது, எனவே புதிய runtime ஒன்றும் சரியே).

# Global ஆக நிறுவுதல்
dotnet tool install -g Majorsilence.Forms.Migrator
majorsilence-migrate --help

# அல்லது repo வாரியாக, ஒரு tool manifest இல் பதிப்பை நிலைப்படுத்தி
dotnet new tool-manifest
dotnet tool install Majorsilence.Forms.Migrator
dotnet majorsilence-migrate --help

எதையும் நிறுவ விரும்பவில்லை என்றால், repository இன் clone ஒன்றிலிருந்து dotnet run --project tools/Majorsilence.Forms.Migrator -- <input> மூலம் இயக்கலாம்.

Migrator எவற்றை மாற்றுகிறது

இலக்கு என்ன நடக்கிறது
.csproj / .vbproj UseWindowsForms/UseWPF ஐ நீக்குகிறது, -windows TFM பின்னொட்டை அகற்றுகிறது (net8.0-windows → net8.0, net10.0-windows10.0.19041.0 → net10.0) — import செய்யப்பட்ட .props/.targets கோப்புகளிலும் சேர்த்து — Windows Desktop framework reference ஐ அகற்றுகிறது, WinForms இற்கு மட்டுமான packages ஐ நீக்குகிறது (Telerik UI for WinForms, DevExpress, System.Drawing.Common), மேலும் மீள்எழுத்து உண்மையில் தொடும் ஒவ்வொரு project இலும் Majorsilence.Forms உம் ஒரு பின்தளமும் சேர்க்கிறது. Central Package Management பயன்படுத்தும் solutions மதிக்கப்படுகின்றன: பதிப்பு இல்லாத PackageReferenceகள், பதிப்புகள் Directory.Packages.props இல் சேர்க்கப்படும்
.cs / .vb நீளமான prefix முதலில் என்ற அட்டவணை மூலம் namespaces ஐ மீண்டும் எழுதுகிறது, அதனால் உருவாகும் இரட்டை using/Imports வரிகளைச் சுருக்குகிறது, தக்கவைக்கப்பட்ட System.Drawing import தெளிவற்றதாக்கும் சில பெயர்களுக்கு aliases சேர்க்கிறது (SystemColors, ColorTranslator, Telerik இன் TabStripItem), மேலும் ApplicationConfiguration.Initialize() ஐ comment செய்கிறது
Visual Basic சிறப்பம்சங்கள் MyType=Empty பொருந்துவது நின்றவுடன் இழக்கப்படும் மறைமுக WinForms constructor ஐ உட்செலுத்துகிறது, ஒரு My.Resources accessor module ஐ உருவாக்குகிறது, மீதமுள்ள My.* பயன்பாடுகளுக்கு எச்சரிக்கை தருகிறது. My.Application.Info.*, My.Resources.*, My.Computer.Name உண்மையாகவே செயல்படுத்தப்பட்டுள்ளன; My.Forms, My.Settings, My.User மற்றும் ஏனையவை இன்னும் எச்சரிக்கை தருகின்றன
.resx Framework மாற்றத்தின் பின்னும் தப்பிப் பிழைக்க வேண்டிய image, type references ஐக் கண்டறிகிறது
Strongly-typed resource designers உருவாக்கப்பட்ட Resources.Designer.cs பாணிக் கோப்புகளில் (அவற்றில் மட்டும்) System.Resources.ResourceManager ஆனது Majorsilence.Forms.ComponentResourceManager ஆக மாறுகிறது; இதனால் உருவாக்கப்பட்ட (Icon) ResourceManager.GetObject(...) casts முதல் resource வாசிப்பிலேயே exception எறியாமல் runtime இல் வெற்றிபெறுகின்றன
அறிக்கை தான் தொட்ட அனைத்தையும், ஒரு மனிதர் பார்க்க வேண்டும் என்று கருதும் அனைத்தையும் சுருக்கும் Markdown அறிக்கையை எழுதுகிறது

System.Drawing.Common அகற்றப்படுவது தோன்றுவதைவிட முக்கியமானது: அதை reference ஆக விட்டால் System.Drawing.Bitmap/Font/Pen ஆகியவை அவற்றின் Majorsilence.Forms.Drawing மாற்றீடுகளுக்கு அருகில் மீண்டும் scope இற்குள் வருகின்றன; அப்போது தகுதிப்படுத்தப்படாத (unqualified) ஒவ்வொரு பயன்பாடும் port ஐ நோக்கித் தீர்க்கப்படாமல் ambiguous reference ஆகத் தோல்வியடைகிறது. மேலும் “மீள்எழுத்து தொடும் projects” என்பது “WinForms projects” ஐவிட அகலமானது: image helper ஒன்றைக் கொண்ட சாதாரண class library ஒன்றும் Majorsilence.Forms.Drawing.* ஆக மீண்டும் எழுதப்படுகிறது, அதற்கும் அந்த reference தேவை. System.Drawing இல் தங்கியிருக்கும் அடிப்படை வகைகளை (Color, Point, Size) மட்டும் பயன்படுத்தும் libraries தொடப்படுவதில்லை.

நீங்கள் உண்மையில் பயன்படுத்தும் options

Krypton Toolkit ports இற்கு ஒரு கூடுதல் படி உண்டு: வகை-உறவு உண்மைகளைக் கருவியால் சரிசெய்ய முடியாது (Majorsilence.Forms இன் Form ஒரு Control அல்ல), எனவே repository, Standard, Extended toolkits இற்காக idempotent bridge scripts ஐ tools/fixups/ இல் வழங்குகிறது; மீதமுள்ள வேலை docs/krypton-port-plan.md இல் கண்காணிக்கப்படுகிறது.

ஒரு git branch இல், இடத்திலேயே இயக்குங்கள்; அப்போது இடம்பெயர்த்தல் என்பது நீங்கள் வாசிக்கவும், மீண்டும் இயக்கவும், திரும்பப் பெறவும் கூடிய ஒரு diff ஆகிறது:

# எதையும் மாற்றும் முன் வீச்சைப் பாருங்கள்
majorsilence-migrate MySolution.sln --dry-run --diff

# பின்னர் உண்மையாகச் செய்யுங்கள் — git தான் backup, எனவே .bak கோப்புகளைத் தவிர்க்கவும்
git checkout -b migrate-to-majorsilence
majorsilence-migrate MySolution.sln --no-backup
git add -A && git commit -m "Migrate to Majorsilence.Forms"

மீள்எழுத்து idempotent ஆனது, எனவே மேலும் பழைய code ஐ merge செய்த பின் மீண்டும் இயக்குவது பாதுகாப்பானது. அறிக்கையை வாசியுங்கள்: அது ஒவ்வொரு எச்சரிக்கையையும் காரணப்படி குழுவாக்குகிறது; மிகவும் பொதுவான “skipped project” என்பது, கருவி அதைப் parse செய்யும் முன் SDK பாணிக்கு மாற்றப்பட வேண்டிய பழைய non-SDK-style .csproj ஆகும் — இது ஒரு முன்தேவைப் படி, இடம்பெயர்த்தலில் உள்ள குறைபாடு அல்ல.

இரண்டு engines

இயல்புநிலை engine வேண்டுமென்றே ஒரு உரை அடிப்படையிலான மீள்எழுதி (textual rewriter) — syntax tree இல்லை, symbol resolution இல்லை. இது ஒரு குறுக்குவழி போலத் தோன்றலாம், ஆனால் அப்படியல்ல: பாதி இடம்பெயர்க்கப்பட்ட solution இலும், இன்னும் யாரும் port செய்யாத type ஒன்றைக் குறிப்பிடும் .vb கோப்பிலும், தற்போது compile ஆகாத project இலும் கருவி வேலை செய்யும் என்பதே இதன் பொருள். Roslyn அடிப்படையிலான கருவி ஒன்று project build ஆகும் வரை அதைத் தொட மறுக்கும்; இது பழைய codebase ஒன்றின் மீதான முதல் சுற்றின் நோக்கத்தையே தோற்கடிக்கிறது. மேலும் இது ஆயிரக்கணக்கான கோப்புகளை வினாடிகளில் கடந்து செல்கிறது.

இது விட்டுக்கொடுப்பது cross-project symbol resolution: இரண்டும் வெறும் பெயரால் பயன்படுத்தப்படும்போது உங்கள் சொந்த Panel class ஐ System.Windows.Forms.Panel இலிருந்து அதனால் வேறுபடுத்த முடியாது. அந்தக் குறிப்பிட்ட சூழலுக்கு, MSBuildWorkspace உம் உண்மையான symbol resolution உம் பயன்படுத்தும் விருப்பத்தேர்வான --engine roslyn உள்ளது. அது மிகவும் மெதுவானது, load செய்யக்கூடிய project ஒன்று தேவை, எனவே அது இரண்டாவது சுற்று — முதலாவது அல்ல. இது project வாரியாக fail closed ஆகிறது: load ஆகாத ஒரு project, அந்த project இன் கோப்புகளுக்கு மட்டும் ஒரு எச்சரிக்கையுடன் text engine இற்குத் திரும்புகிறது.

படிப்படியான இடம்பெயர்த்தல்: ஒரே தடவையில் switch ஐப் புரட்டாமல் இருக்க ஐந்து வழிகள்

ஒரு பெரிய பயன்பாட்டை ஒரே commit இல் நகர்த்த நீங்கள் அரிதாகவே விரும்புவீர்கள். இப்போது அதைப் படிகளாகச் செய்யப் பல வழிகள் உள்ளன, அவற்றை ஒன்றாகச் சேர்த்தும் பயன்படுத்தலாம்.

--dual-build: ஒரே codebase, எந்த stack உம்

--dual-build ஒரு C# project ஐ எந்த stack உடனும் build ஆகும்படி விடுகிறது; ஒரே ஒரு MSBuild property மூலம் மாற்றலாம்; இதனால் port நடந்துகொண்டிருக்கும்போது Windows developer ஒருவர் உண்மையான WinForms உடன் தொடர்ந்து compile செய்யலாம். UseWindowsForms, -windows TFM, WinForms இற்கு மட்டுமான packages அனைத்தும் அப்படியே இருக்கும்; Majorsilence.Forms அவற்றுடன் சேர்க்கப்படுகிறது, கோப்பின் மேலுள்ள using System.Windows.Forms; மட்டும் ஒரு #if MAJORSILENCE_FORMS நிபந்தனையாக மாறுகிறது. மாற்றுவதற்கு Directory.Build.props இல் <MAJORSILENCE_FORMS>true</MAJORSILENCE_FORMS> ஐ அமையுங்கள். VB இற்கு இது வழங்கப்படுவதில்லை — MyType=Empty முழு My framework ஐயும் அணைக்கிறது, அதை preprocessor symbol ஒன்றால் மாற்ற முடியாது — எனவே --dual-build கொடுக்கப்பட்ட VB project ஒன்று எச்சரிக்கையுடன் வழமையான முறையில் மாற்றப்படுகிறது.

WindowsFormsInterop: முழுப் படிவங்கள், இரு திசைகளிலும்

Windows இல், Majorsilence.Forms.WindowsFormsInterop உண்மையான System.Windows.Forms படிவங்களை Avalonia பின்தளத்தில் இயங்கும் Majorsilence.Forms பயன்பாடு ஒன்றுக்குள் ஹோஸ்ட் செய்கிறது (மறுதிசையிலும்), ஒரே Win32 message pump ஐப் பகிர்ந்துகொண்டு; இதனால் இயங்கிக்கொண்டிருக்கும் பயன்பாடு ஒன்றில் முழுத் திரைகளை ஒவ்வொன்றாக நகர்த்தலாம்.

WinForms, WPF பின்தளங்கள்: ஒரு நேரத்தில் ஒரு கட்டுப்பாடு

Majorsilence.Forms.WinForms உம் Majorsilence.Forms.Wpf உம் Windows இற்கு மட்டுமான இடம்பெயர்த்தல் பின்தளங்கள் (migration backends). Avalonia இற்குப் பதிலாக, Majorsilence.Forms இன் கீழுள்ள ஹோஸ்ட் ஒரு உண்மையான System.Windows.Forms சாளரம் (அல்லது ஒரு WPF Window); Skia மேற்பரப்பு ஒரு GDI bitmap (அல்லது ஒரு WriteableBitmap) மூலம் காட்டப்படுகிறது. முக்கியமானது உட்பொதித்தலின் திசை: port செய்யப்பட்ட Majorsilence.Forms கட்டுப்பாடு ஒன்று ஏற்கனவே உள்ள பயன்பாட்டுக்குள் சாதாரண WinForms Control ஆகவோ WPF FrameworkElement ஆகவோ மீண்டும் பொருந்துகிறது.

// WinForms ஹோஸ்ட்
var scene = new Majorsilence.Forms.Panel ();
scene.Controls.Add (new Majorsilence.Forms.Button { Text = "Ported button", Left = 12, Top = 12 });
myWinFormsForm.Controls.Add (scene.ToWinFormsControl ());

// WPF ஹோஸ்ட்
myWpfGrid.Children.Add (myMfControl.ToWpfElement ());

ToWinFormsForm() / ToWpfWindow() முழு Form ஒன்றுக்கும் இதையே செய்கின்றன, உண்மையான native-modal ShowDialog(owner) உட்பட. இரு packages உம் net8.0-windows, net10.0-windows உடன் net48 ஐயும் இலக்காகக் கொள்கின்றன, core package இன் netstandard2.0 build உடன் இணைந்து; இதனால் .NET Framework 4.8 பயன்பாடு ஒன்று நவீன .NET இற்கு நகர்வதற்கு முன்பே Majorsilence.Forms ஐ ஏற்கத் தொடங்கலாம். WinForms கட்டுப்பாட்டு library ஒன்று தனது உட்பகுதிகளை port செய்துகொண்டே, தனது பயனர்களுக்கு WinForms கட்டுப்பாடுகளைத் தொடர்ந்து வழங்கலாம்.

எல்லாம் port செய்யப்பட்டதும், பின்தள package ஐ Majorsilence.Forms.Avalonia (அல்லது Uno, அல்லது GTK 4) ஆக மாற்றுங்கள்; அதே code பல்தளமாகிறது; பின்தள இணைப்புக்கோட்டுக்கு (seam) மேலே எதுவும் மாறுவதில்லை. இந்தப் பின்தளங்களில் IWebViewFactory இல்லை, gesture ஆதரவும் இல்லை; Windows அல்லாத தளங்களில் அவை வெற்று placeholder assemblies ஆக build ஆகின்றன, இதனால் பல்தள solution ஒன்று எங்கும் compile ஆகிறது. மாதிரிகள்: samples/EmbeddingWinForms, samples/Gallery.Wpf; package READMEs: WinForms, WPF.

WinFormsShims.Compat: namespace ஐ மீண்டும் எழுத முடியாதபோது

சில வேளைகளில் using System.Windows.Forms; ஐ மீண்டும் எழுதுவது சாத்தியமில்லை: தனது சொந்த public API System.Windows.Forms/System.Drawing வகைகளில் அமைந்துள்ள, பயனர்களிடம் அவர்களின் code ஐ மாற்றுமாறு கேட்க முடியாத, விநியோகிக்கப்படும் கட்டுப்பாட்டு library ஒன்று. Majorsilence.Forms.WinFormsShims.Compat என்பது Majorsilence.Forms ஐ அடிப்படையாகக் கொண்ட System.Windows.Forms, System.Drawing namespaces ஐ வெளியிடும் Roslyn source generator ஆகும்; இதனால் மாற்றப்படாத WinForms source — Designer.cs கோப்புகள் உட்பட — port உடன் compile ஆகிறது. இது ஒரு proof of concept ஆக வெளியிடப்பட்டுள்ளது: sealed அல்லாத ஒவ்வொரு class இற்கும் subclasses, sealed drawing leaves (Font, Pen, Bitmap…) இற்கு implicit conversions கொண்ட wrappers, forwarding static classes (Application, MessageBox, Brushes…), மற்றும் Control இன் சொந்த நிகழ்வுக் குடும்பம். அதன் முதன்மைக் குறைபாடு Control மூலமான polymorphic storage; C# இன் single inheritance அதை மறைக்க முடியாது. அதை நம்புவதற்கு முன் README இன் scope பகுதியை வாசியுங்கள்; மாதிரி samples/WinFormsCompatDemo, அதன் கண்டுபிடிப்புகள் RESULTS.md இல்.

Theming.WinForms: இரு பாதிகளுக்கும் ஒரே stylesheet

கலப்புப் பயன்பாடு ஒன்றில் ஒரே சாளரத்தில் இரண்டு காட்சி அமைப்புகள் உள்ளன. Majorsilence.Forms.Theming.WinForms Majorsilence.Forms பயன்படுத்தும் அதே CSS தீம் ஐ உண்மையான System.Windows.Forms கட்டுப்பாடுகளுக்குப் பயன்படுத்துகிறது — அதே tokens, அதே selectors, அதே diagnostics — கட்டுப்பாட்டு மரத்தைக் கடந்து BackColor, ForeColor, Font, FlatAppearance, DataGridView cell styles, tokens இலிருந்து கட்டப்பட்ட ToolStripProfessionalRenderer, DWM வழியாக Windows 11 title bar ஆகியவற்றை அமைப்பதன் மூலம். தொடக்கத்தில் ஒருமுறை WinFormsCssTheme.Apply, ஒவ்வொரு படிவத்துக்கும் Track(form), WinForms ஆல் வெளிப்படுத்த முடியாத எதற்கும் Diagnostics ஐ வாசியுங்கள்; எதுவும் மௌனமாகப் புறக்கணிக்கப்படுவதில்லை. ஆதரவு அட்டவணை docs/theming-winforms.md இல் உள்ளது.

Compile ஆன பிறகு

Migrator, code ஐ build ஆகும் நிலைக்குக் கொண்டுவருகிறது. எந்த WinForms நடத்தை முழுமையாகச் செயல்படுத்தப்பட்டுள்ளது, எது தோராயமானது, எது வேண்டுமென்றே வீச்சுக்கு வெளியே உள்ளது என்பதை அது உங்களுக்குச் சொல்வதில்லை — அது இணக்க அட்டவணை (compatibility matrix), அடுத்து வாசிக்க வேண்டிய ஆவணம் அதுவே.

சோதிக்கும் முன் இணக்க அடுக்கின் ஒரு பண்பை நன்கு உள்வாங்கிக்கொள்வது பயனுள்ளது: செயல்படுத்தப்படாத members exception எறிவதற்குப் பதிலாக no-op (எதுவும் செய்யாது) ஆக இருக்கும் அல்லது பொருத்தமான இயல்புநிலை மதிப்பைத் தரும். காட்சி அம்சம் ஒன்று இன்னும் இல்லாத இடங்களிலும் இடம்பெயர்க்கப்பட்ட code compile ஆகி இயங்குகிறது; இது சரியான இயல்புநிலை — ஆனால் ஒரு குறைபாடு சத்தமின்றி மௌனமாக இருக்கலாம் என்பதும் இதன் பொருள். Image.MakeTransparent அப்படி ஒன்றாக இருந்தது: நிற-விசை (colour-keyed) sprite sheet ஒன்று ஒவ்வொரு sprite இன் பின்னாலும் ஒரு வெள்ளைப் பெட்டியுடன் வரையப்பட்டது, எதுவும் exception எறியவில்லை. இப்போது repository இதற்கு எதிராக NoOpStubBaselineTests மூலம் பாதுகாக்கிறது; அது வெற்று உடல் கொண்ட public void methods இன் அறியப்பட்ட தொகுப்பை NoOpStubBaseline.txt இல் நிலைப்படுத்துகிறது (இதை எழுதும் நேரத்தில் 161), இதனால் புதிய stub ஒன்றை ஏற்பது ஒரு உணர்வுபூர்வமான, பதிவுசெய்யப்பட்ட செயலாகிறது. இடம்பெயர்க்கப்பட்ட பயன்பாட்டை build செய்வதோடு நிறுத்தாமல், சோதியுங்கள்.

இணக்கத்தின் இரண்டு பாதிகளிலும் project எங்கே நிற்கிறது:

சோதிக்கும் முன் MIGRATION.md இல் இரண்டு வகையான மாற்றங்களைக் கவனமாக வாசிப்பது பயனுள்ளது, ஏனெனில் இரு வழியிலும் அவை சிக்கலின்றி compile ஆகின்றன:

இடம்பெயர்க்கப்பட்ட உண்மையான பயன்பாடுகள்

இது வெறும் கோட்பாடு அல்ல. Majorsilence இன் சொந்த MPlayercontrol, Reporting ஆகியவை இடம்பெயர்க்கப்பட்டு வருகின்றன; மேலும் இணக்க அடுக்கையும் migrator ஐயும் சோதிப்பதற்காகவே திறந்த மூல WinForms projects பல fork செய்யப்பட்டுள்ளன — ஒரு Notepad++ clone, DarkUI, PKHeX, metroframework, RibbonWinForms, ஒரு Super Mario Bros remake, advanceddatagridview மற்றும் பல. மேலே உள்ள stub baseline அட்டவணையில் உள்ள பல குறைபாடுகள் இவ்வாறே கண்டறியப்பட்டன. முழுப் பட்டியல் repository readme இன் Migrated Project Examples பகுதியில் உள்ளது.

ஒரு யதார்த்தமான திட்டம்

  1. Migrator ஐ ஒரு branch இல் இயக்குங்கள், முதலில் dry-run. அறிக்கையை வாசியுங்கள்.
  2. Compile ஆகச் செய்யுங்கள். Manual-review எச்சரிக்கைகளைக் கையாளுங்கள்; அவை நீங்கியதும் CI இல் --strict ஐச் சேர்க்கவும்.
  3. உங்கள் பயன்பாடு பெரிதும் சார்ந்திருக்கும் எதற்கும் இணக்க அட்டவணையைச் சரிபாருங்கள் — DataGridView, தனிப்பயன் வரைதல், மூன்றாம் தரப்புக் கட்டுப்பாட்டுத் தொகுப்புகள்.
  4. Regressions தெரியும்படி தானியக்க மரத்துக்கு (automation tree) எதிராக UI சோதனைகளை அமையுங்கள்; அது எந்த OS இலும் CI இல் headless ஆக (திரையின்றி) இயங்குகிறது.
  5. முதலில் Windows இற்கு வெளியிடுங்கள் — அதே தளம், புதிய framework, ஒரு நேரத்தில் ஒரு மாறி. பயன்பாடு பெரியதாக இருந்தால், WinForms அல்லது WPF பின்தளத்தில் ஒரு நேரத்தில் ஒரு கட்டுப்பாடாகச் செய்யுங்கள். பின்னர் பின்தளத்தை மாற்றி macOS, Linux ஐச் சேர்க்கவும்.
  6. Package பதிப்பை நிலைப்படுத்துங்கள். Project பீட்டா நிலையில் உள்ளது, API இன்னும் நிலைப்பட்டு வருகிறது.

பயிற்சி வழிகாட்டியின் Module 5 ஒரு குழுவை இதனூடாக விரிவாக அழைத்துச் செல்கிறது, C#, VB.NET இரண்டிலும் உதாரணங்களுடன்.

அடுத்து