MSIX ఆటో-అప్డేట్ సవాళ్లను పరిష్కరించడం
Windows అప్లికేషన్ ప్యాకేజింగ్ ప్రాజెక్ట్తో ప్యాక్ చేయబడిన సైడ్లోడెడ్ యాప్ల కోసం ఆటో-అప్డేట్ ఫంక్షనాలిటీని అమలు చేయడం చాలా కష్టంగా అనిపించవచ్చు, ముఖ్యంగా తెలియని ఎర్రర్లను ఎదుర్కొన్నప్పుడు. డెవలపర్లు తరచుగా గుర్తించబడని నేమ్స్పేస్లు లేదా తప్పిపోయిన డిపెండెన్సీల వంటి సవాళ్లను ఎదుర్కొంటారు. ఈ గైడ్ .NET 8 అప్లికేషన్లోని `ప్యాకేజ్మేనేజర్` తరగతికి సంబంధించిన అటువంటి సమస్యను విశ్లేషిస్తుంది. 🛠️
ఆటో-అప్డేట్ సామర్థ్యాలను జోడించడంలో Microsoft యొక్క డాక్యుమెంటేషన్ను అనుసరిస్తున్నప్పుడు, మీరు రోడ్బ్లాక్లను ఎదుర్కోవచ్చు. యాప్ అప్డేట్లను నిర్వహించడానికి కీలకమైన `ప్యాకేజ్మేనేజర్`ని ఏకీకృతం చేయడానికి ప్రయత్నించినప్పుడు ఒక సాధారణ ప్రమాదం ఏర్పడుతుంది. గంటల కొద్దీ డీబగ్గింగ్ను నివారించడానికి దాని పాత్ర మరియు ముందస్తు అవసరాలను అర్థం చేసుకోవడం చాలా అవసరం. ఇక్కడ, మేము ఈ సాంకేతిక వివరాలను డీమిస్టిఫై చేస్తాము.
అవలోనియాతో సైడ్లోడెడ్ యాప్ను రూపొందిస్తున్నప్పుడు ఈ సమస్యతో నా మొదటి ఎన్కౌంటర్ జరిగింది. జోడించేటప్పుడు `
ఈ కథనంలో, మీ వాతావరణంలో `ప్యాకేజ్మేనేజర్` ఎందుకు గుర్తించబడకపోవచ్చు, దాన్ని ఎలా పరిష్కరించాలి మరియు మీ ఆటో-అప్డేట్ కార్యాచరణ సజావుగా పని చేస్తుందని నిర్ధారించడానికి అవసరమైన సాధనాలను మేము కనుగొంటాము. వాస్తవ-ప్రపంచ ఉదాహరణలు మరియు ఆచరణాత్మక పరిష్కారాలు ఈ సమస్యను సమర్థవంతంగా అధిగమించడం ద్వారా మీకు మార్గనిర్దేశం చేస్తాయి.
ఆదేశం | ఉపయోగం యొక్క ఉదాహరణ |
---|---|
PackageManager.AddPackageAsync | పేర్కొన్న URI నుండి MSIX ప్యాకేజీని ఇన్స్టాల్ చేయడానికి లేదా అప్డేట్ చేయడానికి ఈ పద్ధతి ఉపయోగించబడుతుంది. అవసరమైతే యాప్ షట్డౌన్ను బలవంతంగా ఉపయోగించుకునేందుకు డెవలపర్లను అనుమతిస్తుంది విస్తరణ ఎంపికలు పరామితి. |
DeploymentOptions.ForceApplicationShutdown | అప్డేట్లను వర్తింపజేయడానికి ముందు అప్లికేషన్ యొక్క రన్నింగ్ ఇన్స్టాన్స్లను మూసివేయమని బలవంతం చేసే నిర్దిష్ట విస్తరణ ఎంపిక, అతుకులు లేని ప్యాకేజీ నవీకరణ ప్రక్రియను నిర్ధారిస్తుంది. |
new Uri(string) | ఫైల్ మార్గం లేదా URLని సూచించే స్ట్రింగ్ను URI ఆబ్జెక్ట్గా మారుస్తుంది, ఇది వంటి పద్ధతుల ద్వారా అవసరం AddPackageAsync ప్యాకేజీ అమలు కోసం. |
.GetAwaiter().GetResult() | అసమకాలిక పనిని పూర్తి చేయడానికి వేచి ఉండటానికి సమకాలీకరణ పద్ధతులలో ఉపయోగించే బ్లాకింగ్ కాల్, ఫలితాన్ని నేరుగా అందిస్తుంది. అసమకాలిక ప్రవర్తనకు అసమకాలీకరించని సందర్భంలో ఏకీకరణ అవసరమైనప్పుడు తరచుగా ఉపయోగించబడుతుంది. |
Assert.IsNotNull | ఇచ్చిన ఆబ్జెక్ట్ శూన్యం కాదా అని వెరిఫై చేసే యూనిట్ టెస్ట్ అసెర్షన్, ఒక ఫంక్షన్ లేదా మెథడ్ యొక్క అవుట్పుట్ పరీక్ష సమయంలో అంచనాలను అందుకుంటుంది. |
Assert.Fail | పరీక్ష సమయంలో వైఫల్యం ఎందుకు సంభవించిందో నిర్ధారించడంలో సహాయపడే అనుకూల సందేశాన్ని అందించడం ద్వారా యూనిట్ పరీక్ష విఫలమయ్యేలా చేస్తుంది. |
AppBuilder.Configure | Avalonia అప్లికేషన్లకు ప్రత్యేకమైన పద్ధతి, అప్లికేషన్ కాన్ఫిగరేషన్లను సెటప్ చేయడానికి మరియు GUI రెండరింగ్ కోసం టార్గెట్ ప్లాట్ఫారమ్ను గుర్తించడానికి ఉపయోగిస్తారు. |
UsePlatformDetect | సరైన అనుకూలత మరియు పనితీరు కోసం తగిన రన్టైమ్ ప్లాట్ఫారమ్ను స్వయంచాలకంగా గుర్తించి ఉపయోగించడానికి Avalonia యాప్ని కాన్ఫిగర్ చేస్తుంది. |
StartWithClassicDesktopLifetime | క్లాసిక్ డెస్క్టాప్ ఎన్విరాన్మెంట్ సెటప్తో అవలోనియా అప్లికేషన్ను లాంచ్ చేస్తుంది, ఇది GUI మరియు బ్యాక్గ్రౌండ్ ప్రాసెస్ల అతుకులు లేని ఏకీకరణను అనుమతిస్తుంది. |
Console.WriteLine | డీబగ్గింగ్ లేదా సమాచార ప్రయోజనాల కోసం కన్సోల్కు సందేశాలను అవుట్పుట్ చేస్తుంది. ఈ సందర్భంలో, ఇది విస్తరణ ప్రక్రియ యొక్క విజయం లేదా వైఫల్యాన్ని నివేదిస్తుంది. |
MSIX అప్డేట్లలో ప్యాకేజీ మేనేజర్ పాత్రను అన్వేషించడం
గతంలో అందించిన స్క్రిప్ట్లు సైడ్లోడెడ్ MSIX యాప్లో ఆటో-అప్డేట్ ఫంక్షనాలిటీని సమగ్రపరిచే సమస్యను పరిష్కరించడానికి రూపొందించబడ్డాయి. పరిష్కారం యొక్క ప్రధాన భాగం తరగతి, ప్యాకేజీ ఇన్స్టాలేషన్ మరియు అప్డేట్లను నిర్వహించడంలో కీలక పాత్ర పోషిస్తుంది. `AddPackageAsync` పద్ధతిని ఉపయోగించడం ద్వారా, వినియోగదారు మాన్యువల్గా జోక్యం చేసుకోవలసిన అవసరం లేకుండా అప్డేట్లు సజావుగా వర్తించేలా స్క్రిప్ట్ నిర్ధారిస్తుంది. అప్లికేషన్లను తాజాగా ఉంచాలని లక్ష్యంగా పెట్టుకునే డెవలపర్లకు ఈ కార్యాచరణ చాలా ముఖ్యమైనది, ప్రత్యేకించి ఈ యాప్లు మైక్రోసాఫ్ట్ స్టోర్ వెలుపల అమలు చేయబడినప్పుడు. 🔧
అవలోనియా వంటి నిర్దిష్ట అభివృద్ధి పరిసరాలలో వెంటనే గుర్తించబడని `Windows.Management.Deployment` వంటి నేమ్స్పేస్లతో అనుకూలతను నిర్ధారించడం ఒక ముఖ్యమైన సవాలు. దీన్ని పరిష్కరించడానికి, డెవలపర్లు తప్పనిసరిగా తగిన SDK లేదా డిపెండెన్సీలను ఇన్స్టాల్ చేసినట్లు నిర్ధారించుకోవాలి. ఉదాహరణకు, స్క్రిప్ట్ను రూపొందిస్తున్నప్పుడు, తప్పిపోయిన SDK కారణంగా `ప్యాకేజ్మేనేజర్` క్లాస్ గుర్తించబడని దృష్టాంతాన్ని నేను ఎదుర్కొన్నాను. అవసరమైన సూచనలను జోడించడం వలన సమస్య పరిష్కరించబడింది మరియు నవీకరణ ఫంక్షనాలిటీని విజయవంతంగా అమలు చేయడానికి అనుమతించబడింది.
పటిష్టమైన ఆపరేషన్ను నిర్ధారించడానికి, నవీకరణ ప్రక్రియ సమయంలో మినహాయింపులను పట్టుకోవడానికి స్క్రిప్ట్ లోపం నిర్వహణ పద్ధతులను ప్రభావితం చేస్తుంది. ఉదాహరణకు, MSIX ప్యాకేజీ మార్గం తప్పుగా ఉంటే, స్క్రిప్ట్ లోపాన్ని క్యాప్చర్ చేస్తుంది మరియు డెవలపర్కు తెలియజేస్తుంది, డీబగ్గింగ్ సమయాన్ని తగ్గిస్తుంది. ఇంకా, `DeploymentOptions.ForceApplicationShutdown`ని ఉపయోగించడం వల్ల యాప్ ప్రస్తుతం ఉపయోగంలో ఉన్నప్పటికీ, అప్డేట్ ప్రక్రియ సజావుగా సాగుతుందని నిర్ధారిస్తుంది. ఇది నవీకరణ సమయంలో సంభావ్య వైరుధ్యాలను నివారిస్తుంది మరియు మాన్యువల్ జోక్యాన్ని తొలగిస్తుంది, ఇది డెవలపర్-స్నేహపూర్వకంగా చేస్తుంది. 😊
చివరగా, యూనిట్ పరీక్షలను చేర్చడం వివిధ వాతావరణాలలో కార్యాచరణను ధృవీకరిస్తుంది. నకిలీ ప్యాకేజీలతో అప్డేట్ ప్రాసెస్ను పరీక్షించడం ద్వారా, డెవలపర్లు తమ స్క్రిప్ట్లు ఊహించిన విధంగా పని చేస్తున్నాయని నిర్ధారించగలరు. అదనంగా, `AppBuilder.Configure` వంటి అవలోనియా-నిర్దిష్ట పద్ధతుల ఏకీకరణ GUI అప్లికేషన్లతో అనుకూలతను నిర్ధారిస్తుంది, స్క్రిప్ట్ యొక్క సౌలభ్యాన్ని ప్రదర్శిస్తుంది. ఆచరణలో, ఈ విధానం డెవలపర్లకు మాడ్యులర్ మరియు పునర్వినియోగ పరిష్కారాలను రూపొందించడంలో సహాయపడుతుంది, ఇది సైడ్లోడెడ్ యాప్ల కోసం మృదువైన అప్డేట్లను నిర్ధారిస్తుంది.
MSIX ఆటో-అప్డేట్ కోసం ప్యాకేజీ మేనేజర్ని ఉపయోగించడం: సమస్య రిజల్యూషన్
.NET మరియు Windows.Management.Deployment నేమ్స్పేస్తో C#ని ఉపయోగించి బ్యాకెండ్ సొల్యూషన్
using System;
using Windows.Management.Deployment;
namespace MSIXUpdateManager
{
class Program
{
static void Main(string[] args)
{
try
{
// Initialize the PackageManager
PackageManager packageManager = new PackageManager();
// Path to the updated MSIX package
string packagePath = @"C:\\path\\to\\updated.msix";
// Update the package
var deploymentResult = packageManager.AddPackageAsync(new Uri(packagePath), null, DeploymentOptions.ForceApplicationShutdown).GetAwaiter().GetResult();
Console.WriteLine($"Update successful: {deploymentResult}");
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred: {ex.Message}");
}
}
}
}
ప్రత్యామ్నాయ పరిష్కారం: Avalonia మద్దతు కోసం NuGet ప్యాకేజీని ఉపయోగించండి
Windows.Management.Deploymentతో అనుకూలత కోసం Avalonia మరియు .NET 8తో బ్యాకెండ్ సొల్యూషన్
using System;
using Avalonia;
using Windows.Management.Deployment;
namespace AvaloniaMSIXUpdate
{
class Program
{
static void Main(string[] args)
{
try
{
// Ensure proper namespace recognition
AppBuilder.Configure<App>().UsePlatformDetect().StartWithClassicDesktopLifetime(args);
PackageManager packageManager = new PackageManager();
string packagePath = @"C:\\path\\to\\updated.msix";
var result = packageManager.AddPackageAsync(new Uri(packagePath), null, DeploymentOptions.ForceApplicationShutdown).GetAwaiter().GetResult();
Console.WriteLine("Package updated successfully.");
}
catch (Exception e)
{
Console.WriteLine($"Error during update: {e.Message}");
}
}
}
}
యూనిట్ టెస్ట్: ప్యాకేజీ నవీకరణను ధృవీకరించండి
ప్యాకేజీ నవీకరణ కార్యాచరణను ధృవీకరించడం కోసం MSTest ఉపయోగించి స్క్రిప్ట్ను పరీక్షించండి
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using Windows.Management.Deployment;
[TestClass]
public class MSIXUpdateTests
{
[TestMethod]
public void TestPackageUpdate()
{
try
{
PackageManager packageManager = new PackageManager();
string packagePath = @"C:\\path\\to\\updated.msix";
var result = packageManager.AddPackageAsync(new Uri(packagePath), null, DeploymentOptions.ForceApplicationShutdown).GetAwaiter().GetResult();
Assert.IsNotNull(result, "Update result should not be null.");
}
catch (Exception ex)
{
Assert.Fail($"Update failed with error: {ex.Message}");
}
}
}
MSIX అభివృద్ధిలో డిపెండెన్సీ మేనేజ్మెంట్ను అర్థం చేసుకోవడం
సైడ్లోడ్ చేయబడిన MSIX యాప్లను అభివృద్ధి చేస్తున్నప్పుడు, ఆశించిన విధంగా అప్లికేషన్ ఫంక్షన్లను నిర్ధారించడానికి డిపెండెన్సీలను సరిగ్గా నిర్వహించడం చాలా కీలకం. తరచుగా పట్టించుకోని అంశం కుడిని జోడించడం Package.appxmanifest ఫైల్లో. ఈ సందర్భంలో, `తో సహానవీకరణ-సంబంధిత లక్షణాలను ప్రారంభించడం కోసం ` అవసరం. అయితే, కాన్ఫిగరేషన్ ఒంటరిగా పని చేయదు; మీ అభివృద్ధి వాతావరణంలో అంతర్లీన డిపెండెన్సీలు మరియు నేమ్స్పేస్లు తప్పనిసరిగా అందుబాటులో ఉండాలి.
అవలోనియా వంటి ఫ్రేమ్వర్క్లతో పని చేస్తున్నప్పుడు ఒక నిర్దిష్ట సమస్య తలెత్తుతుంది, ఇందులో డిఫాల్ట్గా `Windows.Management.Deployment` నేమ్స్పేస్కు మద్దతు ఉండకపోవచ్చు. ఇక్కడే NuGet ప్యాకేజీలు లేదా SDK నవీకరణలు అమలులోకి వస్తాయి. "ప్యాకేజ్మేనేజర్ గుర్తించబడలేదు" లోపాన్ని పరిష్కరించడానికి, మీరు అవసరమైన తరగతులను అన్లాక్ చేయడానికి Windows 10 లేదా 11 SDK వంటి నిర్దిష్ట SDKలను ఇన్స్టాల్ చేయాల్సి రావచ్చు. మీరు తాజా ఫ్రేమ్వర్క్ అప్డేట్లను కలిగి ఉన్నారని నిర్ధారించుకోవడం వలన మీకు ముఖ్యమైన ట్రబుల్షూటింగ్ సమయాన్ని ఆదా చేయవచ్చు. ⚙️
అదనంగా, డిపెండెన్సీలను నిర్వహించడంలో పరీక్ష ప్రధాన పాత్ర పోషిస్తుంది. యూనిట్ పరీక్షలను ఉపయోగించడం, ముందుగా ప్రదర్శించిన విధంగా, మీ కాన్ఫిగరేషన్ `ప్యాకేజ్మేనేజర్` క్లాస్ ఫంక్షనాలిటీకి మద్దతిస్తోందని ధృవీకరించడంలో సహాయపడుతుంది. Windows శాండ్బాక్స్ లేదా వర్చువల్ మెషీన్ల వంటి విభిన్న వాతావరణాలలో ఈ పరీక్షలను అమలు చేయడం ద్వారా, మీరు అనుకూలత సమస్యలను ముందుగానే గుర్తించవచ్చు. ఈ ప్రోయాక్టివ్ విధానం డీబగ్గింగ్ను సులభతరం చేస్తుంది మరియు సైడ్లోడెడ్ యాప్ల కోసం మరింత విశ్వసనీయమైన విస్తరణ ప్రక్రియను సృష్టిస్తుంది.
- ఏమి చేస్తుంది ``చేస్తావా?
- ఈ సామర్ధ్యం ప్యాకేజీ ఇన్స్టాలేషన్లు మరియు అప్డేట్లను నిర్వహించడానికి యాప్ను అనుమతిస్తుంది, సైడ్లోడెడ్ యాప్ ఆటో-అప్డేట్లను ఎనేబుల్ చేయడానికి అవసరమైన ఫీచర్.
- `ప్యాకేజ్మేనేజర్` క్లాస్ ఎందుకు గుర్తించబడలేదు?
- తరగతి `Windows.Management.Deployment` నేమ్స్పేస్లో నివసిస్తుంది, దీనికి మీ ప్రాజెక్ట్లో నిర్దిష్ట SDKలు లేదా NuGet ప్యాకేజీలను చేర్చడం అవసరం కావచ్చు.
- "నేమ్స్పేస్ గుర్తించబడలేదు" లోపాన్ని నేను ఎలా పరిష్కరించగలను?
- మీరు Windows 10 లేదా 11 SDKని ఇన్స్టాల్ చేశారని మరియు మీ ప్రాజెక్ట్లో `Windows.Management.Deployment`కి సూచనను చేర్చారని నిర్ధారించుకోండి. మీరు NuGet ద్వారా డిపెండెన్సీలను కూడా జోడించాల్సి రావచ్చు.
- నేను MSIX అప్డేట్ల కోసం అవలోనియాను ఉపయోగించవచ్చా?
- అవును, అవలోనియా MSIX ప్యాకేజింగ్కు మద్దతు ఇస్తుంది, అయితే మీరు `Windows.Management.Deployment` వంటి నేమ్స్పేస్ల కోసం మాన్యువల్గా డిపెండెన్సీలను జోడించాలి మరియు .NET 8తో అనుకూలతను నిర్ధారించుకోవాలి.
- నా స్వీయ-నవీకరణ అమలును నేను ఎలా పరీక్షించగలను?
- యూనిట్ పరీక్షలు రాయడానికి MSTest లేదా xUnit వంటి సాధనాలను ఉపయోగించండి. ఉదాహరణకు, మీ అప్డేట్ లాజిక్ను పరీక్షించదగిన ఫంక్షన్లో వ్రాప్ చేయండి మరియు దాన్ని ఉపయోగించి ధృవీకరించండి మరియు .
- `DeploymentOptions.ForceApplicationShutdown` దేనికి ఉపయోగించబడుతుంది?
- వైరుధ్యాలను నివారించడానికి అప్డేట్ ప్రాసెస్ సమయంలో యాప్ రన్నింగ్ ఇన్స్టేషన్లు మూసివేయబడిందని ఈ ఎంపిక నిర్ధారిస్తుంది.
- సైడ్లోడెడ్ అప్డేట్ల కోసం నాకు ఇంటర్నెట్ యాక్సెస్ అవసరమా?
- లేదు, ఫైల్ పాత్ని ఉపయోగించి స్థానిక మూలం నుండి అప్డేట్లను వర్తింపజేయవచ్చు పద్ధతి.
- ఆటో-అప్డేట్లను ప్రారంభించేటప్పుడు సాధారణ తప్పులు ఏమిటి?
- మానిఫెస్ట్ ఫైల్లో సామర్థ్యాలు లేకపోవడం, మద్దతు లేని SDK సంస్కరణలు మరియు విస్తరణ సమయంలో మినహాయింపులను నిర్వహించడంలో విఫలమవడం సాధారణ లోపాలు.
- అన్ని .NET సంస్కరణల్లో `ప్యాకేజ్మేనేజర్`కి మద్దతు ఉందా?
- లేదు, సరైన SDKలు ఇన్స్టాల్ చేయబడినప్పుడు ఇది సాధారణంగా .NET 5 మరియు అంతకంటే ఎక్కువ కొత్త .NET వెర్షన్లలో మద్దతు ఇస్తుంది.
- అప్డేట్ల కోసం నేను అనుకూల UIని ఉపయోగించవచ్చా?
- అవును, మీరు బ్యాకెండ్ ప్రాసెస్ల కోసం `ప్యాకేజ్మేనేజర్`పై ఆధారపడేటప్పుడు అనుకూల UIని సృష్టించడానికి అవలోనియా వంటి ఫ్రేమ్వర్క్లను ఉపయోగించి మీ యాప్లో అప్డేట్ లాజిక్ను ఇంటిగ్రేట్ చేయవచ్చు.
MSIX యాప్లలో ఆటో-అప్డేట్లను విజయవంతంగా అమలు చేయడానికి మానిఫెస్ట్ కాన్ఫిగరేషన్లు మరియు SDK డిపెండెన్సీల వంటి వివరాలపై శ్రద్ధ వహించడం అవసరం. గుర్తించబడని నేమ్స్పేస్ల వంటి సమస్యలను పరిష్కరించడం ద్వారా, డెవలపర్లు అతుకులు లేని విస్తరణ కార్యాచరణను అన్లాక్ చేయవచ్చు. ఈ పరిష్కారాలు వినియోగదారులకు యాప్లను నిర్వహించడం మరియు నవీకరించడం సులభం చేస్తాయి. 😊
అవలోనియా వంటి ఫ్రేమ్వర్క్లతో సవాళ్లను పరిష్కరించడం బలమైన సాధనాలు మరియు పరీక్షా వ్యూహాల యొక్క ప్రాముఖ్యతను హైలైట్ చేస్తుంది. సరైన కాన్ఫిగరేషన్లు మరియు ప్రోయాక్టివ్ ట్రబుల్షూటింగ్తో, మీరు మీ యాప్లు ఎప్పటికప్పుడు తాజావిగా ఉన్నాయని మరియు విభిన్న వాతావరణాలలో సజావుగా పనిచేస్తాయని నిర్ధారించుకోవచ్చు. ఈ పద్ధతులు సమయాన్ని ఆదా చేస్తాయి మరియు వినియోగదారు అనుభవాన్ని మెరుగుపరుస్తాయి.
- MSIX ప్యాకేజీల కోసం నాన్-స్టోర్ డెవలపర్ అప్డేట్లను ప్రారంభించడంపై వివరణాత్మక సూచనలు అధికారిక Microsoft డాక్యుమెంటేషన్ నుండి పొందబడ్డాయి. మీరు ఇక్కడ మరింత సమాచారాన్ని కనుగొనవచ్చు: నాన్-స్టోర్ డెవలపర్ అప్డేట్లు .
- సమస్య పరిష్కారానికి సంబంధించిన అంతర్దృష్టులు `కమ్యూనిటీ చర్చలు మరియు అధికారిక Windows SDK మార్గదర్శకాల ద్వారా కాన్ఫిగరేషన్ మరియు నేమ్స్పేస్ సమస్యలను పరిష్కరించడం జరిగింది. SDK డాక్యుమెంటేషన్ను ఇక్కడ చదవండి: Windows SDK డాక్యుమెంటేషన్ .
- అవలోనియా అప్లికేషన్లలో MSIX ఫంక్షనాలిటీని సమగ్రపరచడానికి నిర్దిష్ట పరిష్కారాలు అవలోనియా ఫ్రేమ్వర్క్ వనరుల ద్వారా తెలియజేయబడ్డాయి. ఇక్కడ మరింత అన్వేషించండి: అవలోనియా UI ఫ్రేమ్వర్క్ .