Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Poznámka:
Některé informace se týkají předem vydaného produktu, který může být podstatně změněn před komerčním vydáním. Společnost Microsoft neposkytuje žádné záruky, výslovné ani implicitní, ohledně zde poskytnutých informací.
Tento článek vás provede vytvořením jednoduchého poskytovatele informačního kanálu, který zaregistruje identifikátor URI obsahu informačního kanálu a implementuje rozhraní IFeedProvider . Metody tohoto rozhraní jsou vyvolány panelem Widgets k vyžádání vlastních parametrů řetězce dotazu, obvykle pro podporu scénářů ověřování. Poskytovatelé informačních kanálů můžou podporovat jeden nebo více informačních kanálů.
Pokud chcete implementovat poskytovatele informačního kanálu pomocí C++/WinRT, přečtěte si téma Implementace poskytovatele informačního kanálu v aplikaci win32 (C++/WinRT).
Požadavky
- Vaše zařízení musí mít povolený vývojářský režim. Další informace najdete v tématu Nastavení pro vývojáře.
- Visual Studio 2026 nebo novější s úlohou vývoje aplikací WinUI
Vytvoření nové konzolové aplikace jazyka C#
V sadě Visual Studio vytvořte nový projekt. V dialogovém okně Vytvořit nový projekt nastavte filtr jazyka na C# a filtr platformy na Windows a pak vyberte šablonu projektu konzolové aplikace. Pojmenujte nový projekt ExampleFeedProvider. V tomto názorném postupu se ujistěte, že není zaškrtnuto políčko Umístit řešení a projekt do stejného adresáře . Po zobrazení výzvy nastavte cílovou verzi .NET na 6.0.
Když se projekt načte, v Průzkumníku řešení pravým tlačítkem myši klikněte na název projektu a vyberte Vlastnosti. Na stránce Obecné přejděte dolů na Cílový OS a vyberte "Windows". V části Cílová verze operačního systému vyberte verzi 10.022631.2787 nebo novější.
Všimněte si, že tento návod používá konzolovou aplikaci, která zobrazí konzolové okno při aktivaci, což umožňuje snadné ladění. Až budete připraveni publikovat aplikaci poskytovatele informačního kanálu, můžete konzolovou aplikaci převést na aplikaci pro Windows pomocí postupu v části Převod konzolové aplikace do aplikace pro Windows.
Přidejte odkazy na balíček NuGet Windows App SDK
Tato ukázka používá nejnovější stabilní balíček NuGet sady Windows App SDK. Ve Průzkumníku řešeníklikněte pravým tlačítkem na Závislosti a vyberte Spravovat balíčky NuGet.... V nástroji pro správu balíčků NuGet vyberte kartu Procházet a vyhledejte "Microsoft.WindowsAppSDK". V rozevíracím seznamu Verze vyberte nejnovější stabilní verzi a klikněte na Nainstalovat.
Přidejte třídu FeedProvider pro správu operací informačního kanálu
V sadě Visual Studio klikněte pravým tlačítkem na projekt ExampleFeedProvider v Průzkumníku řešení a vyberte Přidat –>Třída. V dialogovém okně Přidat třídu pojmenujte třídu FeedProvider a klikněte na Tlačítko Přidat. Vygenerovaný FeedProvider.cs soubor aktualizujte definici třídy tak, aby indikovala, že implementuje IFeedProvider rozhraní.
Vytvořte CLSID, který se použije k identifikaci poskytovatele kanálu pro aktivaci COM. Vygenerujte GUID v sadě Visual Studio tak, že přejdete na Tools->Vytvořit GUID. Uložte tento identifikátor GUID do textového souboru, který se použije později při balení aplikace poskytovatele informačního kanálu. Nahraďte identifikátor GUID v poznámkách pro třídu FeedProvider zobrazenou v následujícím příkladu.
// FeedProvider.cs
using Microsoft.Windows.Widgets.Feeds.Providers;
...
[ComVisible(true)]
[ComDefaultInterface(typeof(IFeedProvider))]
[Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]
public sealed class FeedProvider : IFeedProvider
Implementace metod IFeedProvider
V následujících několika částech budeme implementovat metody IFeedProvider rozhraní.
Poznámka:
Objekty předané do metod zpětného volání rozhraní IFeedProvider jsou garantovány jako platné pouze v rámci zpětného volání. Odkazy na tyto objekty byste neměli ukládat, protože jejich chování mimo kontext zpětného volání není definováno.
OnFeedProviderEnabled
OnFeedProviderEnabled metoda je vyvolána, když informační kanál přidružený k poskytovateli je vytvořen hostitelem Widgets Board. V implementaci této metody vygenerujte řetězec dotazu s parametry, které budou předány adrese URL, která poskytuje obsah informačního kanálu, včetně všech nezbytných ověřovacích tokenů. Vytvořte instanci CustomQueryParametersUpdateOptions předáním FeedProviderDefinitionId z argumentů události, který identifikuje aktivovaný kanál, a řetězce dotazu. Získejte výchozí FeedManager a zavolejte SetCustomQueryParameters pro registraci parametrů řetězce dotazu na panel Widgets Board.
// FeedProvider.cs
public void OnFeedProviderEnabled(FeedProviderEnabledArgs args)
{
Console.WriteLine($"{args.FeedProviderDefinitionId} feed provider was enabled.");
var updateOptions = new CustomQueryParametersUpdateOptions(args.FeedProviderDefinitionId, "param1¶m2");
FeedManager.GetDefault().SetCustomQueryParameters(updateOptions);
}
OnFeedProviderDisabled
OnFeedProviderDisabled je volána, když je panel widgetů, když byly všechny informační kanály pro tohoto poskytovatele zakázány. Poskytovatelé informačních kanálů nemusí provádět žádné akce v reakci na toto volání této metody. Volání metody je možné použít pro účely telemetrie nebo aktualizovat parametry řetězce dotazu nebo v případě potřeby odvolat ověřovací tokeny. Pokud aplikace podporuje pouze jednoho poskytovatele informačního kanálu nebo pokud jsou všichni poskytovatelé informačního kanálu podporovaní aplikací zakázáni, aplikace se může ukončit v reakci na toto zpětné volání.
// FeedProvider.cs
public void OnFeedProviderDisabled(FeedProviderDisabledArgs args)
{
Console.WriteLine($"{args.FeedProviderDefinitionId} feed provider was disabled.");
}
OnFeedEnabled (Při zapnutí zdroje), OnFeedDisabled (Při vypnutí zdroje)
OnFeedEnabled a OnFeedDisabled jsou vyvolány panelem widgetů, pokud je informační kanál povolený nebo zakázaný. Poskytovatelé informačních kanálů nemusí provádět žádné akce v reakci na volání těchto metod. Volání metody je možné použít pro účely telemetrie nebo aktualizovat parametry řetězce dotazu nebo v případě potřeby odvolat ověřovací tokeny.
// FeedProvider.cs
public void OnFeedEnabled(FeedEnabledArgs args)
{
Console.WriteLine($"{args.FeedDefinitionId} feed was enabled.");
}
// FeedProvider.cs
public void OnFeedDisabled(FeedDisabledArgs args)
{
Console.WriteLine($"{args.FeedDefinitionId} feed was disabled.");
}
OnCustomQueryParametersRequested (při požadavku na vlastní parametry dotazu)
OnCustomQueryParametersRequested je vyvolán , když panel Widgets určuje, že vlastní parametry dotazu přidružené k poskytovateli informačního kanálu musí být aktualizovány. Tato metoda může být vyvolána v případě, že například operace pro načtení obsahu kanálu ze vzdálené webové služby selže. FeedProviderDefinitionId vlastnost CustomQueryParametersRequestedArgs předané do této metody určuje informační kanál, pro který jsou požadovány parametry řetězce dotazu. Zprostředkovatel by měl znovu vygenerovat řetězec dotazu a předat ho zpět na panel widgetů voláním SetCustomQueryParameters.
// FeedProvider.cs
public void OnCustomQueryParametersRequested(CustomQueryParametersRequestedArgs args)
{
Console.WriteLine($"CustomQueryParamaters were requested for {args.FeedProviderDefinitionId}.");
var updateOptions = new CustomQueryParametersUpdateOptions(args.FeedProviderDefinitionId, "param1¶m2");
FeedManager.GetDefault().SetCustomQueryParameters(updateOptions);
}
Implementace objektu pro vytváření tříd, který vytvoří instanci FeedProvideru na žádost
Aby hostitel informačního kanálu mohl komunikovat s naším poskytovatelem informačního kanálu, musíme použít CoRegisterClassObject. Tato funkce vyžaduje, abychom vytvořili implementaci IClassFactory , která vytvoří objekt třídy pro naši FeedProvider třídy. Náš objekt pro vytváření tříd implementujeme do samostatné pomocné třídy.
V sadě Visual Studio klikněte pravým tlačítkem na projekt ExampleFeedProvider v Průzkumníku řešení a vyberte Přidat –>Třída. V dialogovém okně Přidat třídu pojmenujte třídu FactoryHelper a klikněte na Přidat.
Obsah souboru FactoryHelper.cs nahraďte následujícím kódem. Tento kód definuje IClassFactory rozhraní a implementuje jeho dvě metody, CreateInstance a LockServer. Tento kód je typický pro implementaci objektu pro vytváření tříd a není specifický pro funkce poskytovatele informačního kanálu s tím rozdílem, že označujeme, že objekt třídy, který se vytváří, implementuje IFeedProvider rozhraní.
// FactoryHelper.cs
using Microsoft.Windows.Widgets.Feeds.Providers;
using System.Runtime.InteropServices;
using WinRT;
namespace ExampleFeedProvider
{
namespace Com
{
static class Guids
{
public const string IClassFactory = "00000001-0000-0000-C000-000000000046";
public const string IUnknown = "00000000-0000-0000-C000-000000000046";
}
[ComImport(), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid(Guids.IClassFactory)]
internal interface IClassFactory
{
[PreserveSig]
int CreateInstance(IntPtr pUnkOuter, ref Guid riid, out IntPtr ppvObject);
[PreserveSig]
int LockServer(bool fLock);
}
static class ClassObject
{
public static void Register(Guid clsid, object pUnk, out uint cookie)
{
[DllImport("ole32.dll")]
static extern int CoRegisterClassObject(
[MarshalAs(UnmanagedType.LPStruct)] Guid rclsid,
[MarshalAs(UnmanagedType.IUnknown)] object pUnk,
uint dwClsContext,
uint flags,
out uint lpdwRegister);
int result = CoRegisterClassObject(clsid, pUnk, 0x4, 0x1, out cookie);
if (result != 0)
{
Marshal.ThrowExceptionForHR(result);
}
}
public static int Revoke(uint cookie)
{
[DllImport("ole32.dll")]
static extern int CoRevokeClassObject(uint dwRegister);
return CoRevokeClassObject(cookie);
}
}
}
internal class FeedProviderFactory<T> : Com.IClassFactory
where T : IFeedProvider, new()
{
public int CreateInstance(IntPtr pUnkOuter, ref Guid riid, out IntPtr ppvObject)
{
ppvObject = IntPtr.Zero;
if (pUnkOuter != IntPtr.Zero)
{
Marshal.ThrowExceptionForHR(CLASS_E_NOAGGREGATION);
}
if (riid == typeof(T).GUID || riid == Guid.Parse(Com.Guids.IUnknown))
{
// Create the instance of the .NET object
ppvObject = MarshalInspectable<IFeedProvider>.FromManaged(new T());
}
else
{
// The object that ppvObject points to does not support the
// interface identified by riid.
Marshal.ThrowExceptionForHR(E_NOINTERFACE);
}
return 0;
}
int Com.IClassFactory.LockServer(bool fLock)
{
return 0;
}
private const int CLASS_E_NOAGGREGATION = -2147221232;
private const int E_NOINTERFACE = -2147467262;
}
}
Zaregistrujte objekt třídy poskytovatele informačního kanálu v OLE
V souboru Program.cs pro náš spustitelný soubor zavoláme CoRegisterClassObject k registraci poskytovatele informačního kanálu v OLE, aby s ním panel widgetů mohl pracovat. Obsah Program.cs nahraďte následujícím kódem. To používá FeedProviderFactory rozhraní, které jsme definovali v předchozím kroku k registraci pomocné třídy FeedProvider . Pro účely ladění tento příklad volá GetEnabledFeedProviders na výchozí instanci FeedManager, aby získal seznam objektů FeedProviderInfo, které představují povolené zprostředkovatele informačního kanálu. Cyklus prochází poskytovateli povolených informačních kanálů pomocí vlastnosti EnabledFeedDefinitionIds k výpisu všech povolených ID informačního kanálu.
// Program.cs
using Microsoft.Windows.Widgets.Feeds.Providers;
using Microsoft.Windows.Widgets.Providers;
using System;
using System.Runtime.InteropServices;
namespace ExampleFeedProvider
{
public static class Program
{
[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();
[MTAThread]
static void Main(string[] args)
{
Console.WriteLine("FeedProvider Starting...");
if (args.Length > 0 && args[0] == "-RegisterProcessAsComServer")
{
WinRT.ComWrappersSupport.InitializeComWrappers();
uint registrationHandle;
var factory = new FeedProviderFactory<FeedProvider>();
Com.ClassObject.Register(typeof(FeedProvider).GUID, factory, out registrationHandle);
Console.WriteLine("Feed Provider registered.");
var existingFeedProviders = FeedManager.GetDefault().GetEnabledFeedProviders();
if (existingFeedProviders != null)
{
Console.WriteLine($"There are {existingFeedProviders.Length} FeedProviders currently outstanding:");
foreach (var feedProvider in existingFeedProviders)
{
Console.WriteLine($" ProviderId: {feedProvider.FeedProviderDefinitionId}, DefinitionIds: ");
var m = WidgetManager.GetDefault().GetWidgetIds();
if (feedProvider.EnabledFeedDefinitionIds != null)
{
foreach (var enabledFeedId in feedProvider.EnabledFeedDefinitionIds)
{
Console.WriteLine($" {enabledFeedId} ");
}
}
}
}
if (GetConsoleWindow() != IntPtr.Zero)
{
Console.WriteLine("Press ENTER to exit.");
Console.ReadLine();
}
else
{
while (true)
{
// You should fire an event when all the outstanding
// FeedProviders have been disabled and exit the app.
}
}
}
else
{
Console.WriteLine("Not being launched to service Feed Provider... exiting.");
}
}
}
}
Všimněte si, že tento příklad kódu naimportuje funkci GetConsoleWindow , která určí, jestli je aplikace spuštěná jako konzolová aplikace, výchozí chování pro tento názorný postup. Pokud funkce vrátí platný ukazatel, zapíšeme do konzoly informace o ladění. Jinak je aplikace spuštěná jako aplikace pro Windows. V takovém případě počkáme na událost, kterou jsme nastavili v metodě OnFeedProviderDisabled , když je seznam povolených poskytovatelů informačního kanálu prázdný a ukončíme aplikaci. Informace o převodu ukázkové konzolové aplikace na aplikaci pro Windows najdete v tématu Převod konzolové aplikace na aplikaci pro Windows.
Připravte aplikaci poskytovatele informačního kanálu
V aktuální verzi je možné jako poskytovatele informačních kanálů zaregistrovat pouze zabalené aplikace. Následující kroky vás provedou procesem zabalení aplikace a aktualizací manifestu aplikace pro registraci aplikace v operačním systému jako poskytovatele informačního kanálu.
Vytvoření projektu balení MSIX
V Průzkumníku řešeníklikněte pravým tlačítkem na své řešení a vyberte Přidat–>Nový projekt.... V dialogovém okně Přidat nový projekt vyberte šablonu Projekt balení aplikace pro Windows a klikněte na Další. Nastavte název projektu na ExampleFeedProviderPackage a klikněte na Vytvořit. Po zobrazení výzvy nastavte cílovou verzi na build 22621 nebo novější a klikněte na TLAČÍTKO OK. Poté klikněte pravým tlačítkem myši na projekt ExampleFeedProviderPackage a vyberte Odkaz na projekt>. Vyberte projekt ExampleFeedProvider a klepněte na tlačítko OK.
Přidání odkazu na balíček sady Windows App SDK do projektu balení
Do projektu balíčku MSIX musíte přidat odkaz na balíček NuGet sady Windows App SDK. V Průzkumníku řešení poklikejte na projekt ExampleFeedProviderPackage a otevřete soubor ExampleFeedProviderPackage.wapproj. Do elementu Project přidejte následující kód XML.
<!--ExampleWidgetProviderPackage.wapproj-->
<ItemGroup>
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.5.231116003-experimentalpr">
<IncludeAssets>build</IncludeAssets>
</PackageReference>
</ItemGroup>
Poznámka:
Ujistěte se, že verze zadaná v elementu PackageReference odpovídá nejnovější stabilní verzi, na kterou jste odkazovali v předchozím kroku.
Pokud je v počítači nainstalovaná správná verze sady Windows App SDK a nechcete v balíčku zabalit modul runtime sady SDK, můžete určit závislost balíčku v souboru Package.appxmanifest pro projekt ExampleFeedProviderPackage.
<!--Package.appxmanifest-->
...
<Dependencies>
...
<PackageDependency Name="Microsoft.WindowsAppRuntime.1.5.233430000-experimental1" MinVersion="2000.638.7.0" Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" />
...
</Dependencies>
...
Aktualizace manifestu balíčku
Ve Průzkumníku řešení klikněte pravým tlačítkem na soubor Package.appxmanifest a vyberte možnost Zobrazit kód, abyste otevřeli soubor XML manifestu. Dále je potřeba přidat deklarace oboru názvů pro některá rozšíření balíčků aplikací, které budeme používat. Do elementu nejvyšší úrovně Package přidejte následující definice oboru názvů.
<!-- Package.appmanifest -->
<Package
...
xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
xmlns:com="http://schemas.microsoft.com/appx/manifest/com/windows10"
Uvnitř elementu Application vytvořte nový prázdný prvek s názvem Extensions. Dbejte na to, aby to přišlo po uzavírací značce uap:VisualElements.
<!-- Package.appxmanifest -->
<Application>
...
<Extensions>
</Extensions>
</Application>
První rozšíření, které potřebujeme přidat, je rozšíření ComServer. Tím se zaregistruje vstupní bod spustitelného souboru v operačním systému. Toto rozšíření je ekvivalentem zabalené aplikace pro registraci serveru COM nastavením klíče registru a není specifické pro poskytovatele widgetů. Přidejte následující prvek com:Extension jako podřízený prvek Extensions. Změňte GUID v atributu Id elementu com:Class na GUID, který jste vygenerovali v předchozím kroku při definování třídy FeedProvider.
<!-- Package.appxmanifest -->
<Extensions>
<com:Extension Category="windows.comServer">
<com:ComServer>
<com:ExeServer Executable="ExampleFeedProvider\ExampleFeedProvider.exe" Arguments="-RegisterProcessAsComServer" DisplayName="C# Feed Provider App">
<com:Class Id="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" DisplayName="FeedProvider" />
</com:ExeServer>
</com:ComServer>
</com:Extension>
</Extensions>
Dále přidejte rozšíření, které registruje aplikaci jako poskytovatele kanálu. V následujícím úseku kódu vložte prvek uap3:Extension jako podřízený prvek elementu Extensions. Nezapomeňte nahradit atribut ClassId elementu COM identifikátorem GUID, který jste použili v předchozích krocích.
<!-- Package.appxmanifest -->
<Extensions>
...
<uap3:Extension Category="windows.appExtension">
<uap3:AppExtension Name="com.microsoft.windows.widgets.feeds" DisplayName="ContosoFeed" Id="com.examplewidgets.examplefeed" PublicFolder="Public">
<uap3:Properties>
<FeedProvider Icon="ms-appx:Assets\StoreLogo.png" Description="FeedDescription">
<Activation>
<!-- Apps exports COM interface which implements IFeedProvider -->
<CreateInstance ClassId="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" />
</Activation>
<Definitions>
<Definition Id="Contoso_Feed"
DisplayName="Contoso_Feed Feed"
Description="Feed representing Contoso"
ContentUri="https://www.contoso.com/"
Icon="ms-appx:Images\StoreLogo.png">
</Definition>
<Definition Id="Fabrikam_Feed"
DisplayName="Fabrikam Feed"
Description="Feed representing Example"
ContentUri="https://www.fabrikam.com/"
Icon="ms-appx:Images\StoreLogo.png">
</Definition>
</Definitions>
</FeedProvider>
</uap3:Properties>
</uap3:AppExtension>
</uap3:Extension>
</Extensions>
Podrobné popisy a informace o formátu pro všechny tyto prvky naleznete v souboru XML manifestu balíčku informačního kanálu.
Testování poskytovatele informačního kanálu
Ujistěte se, že jste vybrali architekturu, která odpovídá vašemu vývojovému počítači, z rozevíracího seznamu platformy řešení , například x64. V Průzkumníku řešeníklikněte pravým tlačítkem na vaše řešení a vyberte Sestavit řešení. Po dokončení klikněte pravým tlačítkem na ExampleWidgetProviderPackage a vyberte možnost Nasadit. Konzolová aplikace by se měla spustit při nasazení a ve výstupu konzole uvidíte, jak se povolí kanály. Otevřete panel widgetů a měli byste vidět nové informační kanály v kartách podél horní části sekce.
Ladění poskytovatele informačního kanálu
Po připnutí informačních kanálů spustí platforma widgetů aplikaci poskytovatele informačního kanálu, aby mohla přijímat a odesílat relevantní informace o informačním kanálu. Pokud chcete ladit běžící datový kanál, můžete buď připojit debugger k aplikaci poskytovatele kanálu, nebo můžete nastavit Visual Studio tak, aby po spuštění automaticky zahájilo ladění procesu poskytovatele datového kanálu.
Chcete-li se připojit ke spuštěném procesu:
- V sadě Visual Studio klikněte na Ladit –> Připojit k procesu.
- Přefiltrujte procesy a najděte požadovanou aplikaci poskytovatele napájení.
- Připojte ladicí program.
Pokud chcete automaticky připojit ladicí program k procesu při počátečním spuštění:
- Ve Visual Studiu klikněte na Ladění –> Další cíle ladění –> Ladění nainstalovaného balíčku aplikace.
- Vyfiltrujte balíčky a najděte požadovaný balíček poskytovatele kanálu.
- Vyberte jej a zaškrtněte políčko s názvem Nespouštět, ale při spuštění ladit můj kód.
- Klepněte na tlačítko Připojit.
Převod konzolové aplikace na aplikaci pro Windows
Chcete-li převést konzolovou aplikaci vytvořenou v tomto názorném postupu na aplikaci pro Windows, klikněte pravým tlačítkem myši na projekt ExampleFeedProvider v Průzkumníku řešení a vyberte Vlastnosti. V části Obecné aplikace> změňte typ výstupu z konzolové aplikace na "Aplikace systému Windows".
Publikování aplikace pro správu informačního kanálu
Po vytvoření a otestování poskytovatele informačního kanálu můžete aplikaci publikovat v Microsoft Storu, aby si uživatelé nainstalovali informační kanály na svá zařízení. Podrobné pokyny k publikování aplikace najdete v tématu Publikování aplikace v Microsoft Storu.
Kolekce informačních kanálů
Po publikování aplikace v Microsoft Storu si můžete vyžádat, aby byla vaše aplikace zahrnuta do kolekce obchodu Store Collection, která pomáhá uživatelům objevovat aplikace, jež obsahují kanály Windows. Pokud chcete odeslat žádost, podívejte se na Odeslání vašeho informačního kanálu/panelu pro přidání do kolekce obchodu.
Windows developer