Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Opmerking
Sommige informatie heeft betrekking op vooraf uitgebrachte producten, die aanzienlijk kunnen worden gewijzigd voordat het commercieel wordt uitgebracht. Microsoft geeft geen garanties, uitdrukkelijk of impliciet, met betrekking tot de informatie die hier wordt verstrekt.
In dit artikel wordt uitgelegd hoe u een eenvoudige feedprovider maakt waarmee een feedinhouds-URI wordt geregistreerd en de IFeedProvider-interface wordt geïmplementeerd. De methoden van deze interface worden aangeroepen door het widgetsbord om aangepaste queryreeksparameters aan te vragen, meestal ter ondersteuning van verificatiescenario's. Feedproviders kunnen één feed of meerdere feeds ondersteunen.
Zie Een feedprovider implementeren in een win32-app (C++/WinRT) als u een feedprovider wilt implementeren met C++/WinRT.
Vereiste voorwaarden
- Op uw apparaat moet de ontwikkelaarsmodus zijn ingeschakeld. Zie Instellingen voor ontwikkelaars voor meer informatie.
- Visual Studio 2026 of hoger met de workload voor het ontwikkelen van WinUI-toepassingen .
Een nieuwe C#-console-app maken
Maak in Visual Studio een nieuw project. Stel in het dialoogvenster Een nieuw project maken het taalfilter in op 'C#' en het platformfilter op Windows en selecteer vervolgens de console-app-projectsjabloon. Geef het nieuwe project de naam ExampleFeedProvider. Controleer voor deze handleiding dat Oplossing en project in dezelfde map plaatsen niet is aangevinkt. Stel de doelversie van .NET in op 6.0 wanneer u hierom wordt gevraagd.
Wanneer het project wordt geladen, klikt u in Solution Explorer met de rechtermuisknop op de projectnaam en selecteert u Eigenschappen. Op de pagina Algemeen, schuif omlaag naar Doelbesturingssysteem en selecteer "Windows". Selecteer onder Doelversie van het besturingssysteem versie 10.022631.2787 of hoger.
Houd er rekening mee dat in dit scenario een console-app wordt gebruikt die het consolevenster weergeeft wanneer de feed wordt geactiveerd om eenvoudige foutopsporing in te schakelen. Wanneer u klaar bent om uw feedprovider-app te publiceren, kunt u de consoletoepassing converteren naar een Windows-toepassing door de stappen in Uw console-app converteren naar een Windows-app te volgen.
Verwijzingen toevoegen aan het NuGet-pakket van de Windows App SDK
In dit voorbeeld wordt het meest recente stabiele NuGet-pakket voor Windows App SDK gebruikt. Klik in Solution Explorer met de rechtermuisknop op Afhankelijkheden en selecteer NuGet-pakketten beheren.... Selecteer in NuGet Package Manager het tabblad Bladeren en zoek naar Microsoft.WindowsAppSDK. Selecteer de meest recente stabiele versie in de vervolgkeuzelijst Versie en klik vervolgens op Installeren.
Een FeedProvider-klasse toevoegen om feedbewerkingen te verwerken
Klik in Visual Studio met de rechtermuisknop op het ExampleFeedProvider-project in de Solution Explorer en selecteer Toevoegen->Klasse. Geef in het dialoogvenster Klasse toevoegen de klasse FeedProvider een naam en klik op Toevoegen. Werk in het gegenereerde FeedProvider.cs-bestand de klassedefinitie bij om aan te geven dat de IFeedProvider-interface wordt geïmplementeerd.
Maak een CLSID die wordt gebruikt om uw feedprovider te identificeren voor COM-activering. Genereer een GUID in Visual Studio door naar Hulpmiddelen te gaan en>GUID makente selecteren. Sla deze GUID op in een tekstbestand dat later moet worden gebruikt bij het verpakken van de feedprovider-app. Vervang de GUID in de aantekeningen voor de FeedProvider-klasse die wordt weergegeven in het volgende voorbeeld.
// FeedProvider.cs
using Microsoft.Windows.Widgets.Feeds.Providers;
...
[ComVisible(true)]
[ComDefaultInterface(typeof(IFeedProvider))]
[Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]
public sealed class FeedProvider : IFeedProvider
De IFeedProvider-methoden implementeren
In de volgende secties implementeren we de methoden van de IFeedProvider-interface .
Opmerking
Objecten die worden doorgegeven aan de callback-methoden van de IFeedProvider-interface , zijn alleen gegarandeerd geldig in de callback. U mag geen verwijzingen naar deze objecten opslaan omdat hun gedrag buiten de context van de callback niet is gedefinieerd.
OnFeedProviderEnabled
De methode OnFeedProviderEnabled wordt aangeroepen wanneer een feed die is gekoppeld aan de provider wordt gemaakt door de widgetsbordhost. Genereer in de implementatie van deze methode een queryreeks met de parameters die worden doorgegeven aan de URL die de feedinhoud levert, inclusief de benodigde verificatietokens. Maak een exemplaar van CustomQueryParametersUpdateOptions en geef de FeedProviderDefinitionId mee vanuit de eventargs die de feed identificeert die is ingeschakeld en de queryreeks. Haal de standaardFeedManager op en roep SetCustomQueryParameters aan om de queryreeksparameters te registreren bij het widgetsbord.
// 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);
}
BijUitschakelingVanFeedProvider
OnFeedProviderDisabled wordt aangeroepen wanneer het Widgets Board al de feeds voor deze provider heeft uitgeschakeld. Feedproviders hoeven geen acties uit te voeren als reactie op deze methode-aanroep. De aanroep van de methode kan worden gebruikt voor telemetriedoeleinden of om de queryreeksparameters bij te werken of indien nodig verificatietokens in te trekken. Als de app slechts één feedprovider ondersteunt of als alle feedproviders die door de app worden ondersteund, zijn uitgeschakeld, kan de app afsluiten als reactie op deze callback.
// FeedProvider.cs
public void OnFeedProviderDisabled(FeedProviderDisabledArgs args)
{
Console.WriteLine($"{args.FeedProviderDefinitionId} feed provider was disabled.");
}
OnFeedEnabled, OnFeedDisabled
OnFeedEnabled en OnFeedDisabled worden aangeroepen door het widgetsbord wanneer een feed is ingeschakeld of uitgeschakeld. Feedproviders hoeven geen acties uit te voeren als reactie op deze methode-aanroepen. De aanroep van de methode kan worden gebruikt voor telemetriedoeleinden of om de queryreeksparameters bij te werken of indien nodig verificatietokens in te trekken.
// 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
OnCustomQueryParametersRequested wordt gegenereerd wanneer het widgetsbord bepaalt dat de aangepaste queryparameters die zijn gekoppeld aan de feedprovider moeten worden vernieuwd. Deze methode kan bijvoorbeeld worden gegenereerd als de bewerking voor het ophalen van feedinhoud uit de externe webservice mislukt. De eigenschap FeedProviderDefinitionId van de CustomQueryParametersRequestedArgs die in deze methode is doorgegeven, geeft de feed op waarvoor queryreeksparams worden aangevraagd. De provider moet de querytekenreeks opnieuw genereren en deze doorgeven aan het widgetsbord door SetCustomQueryParameters aan te roepen.
// 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);
}
Een klassefactory implementeren waarmee FeedProvider op aanvraag wordt geïnstitueert
Om de feedhost te laten communiceren met onze feedprovider, moeten we CoRegisterClassObject aanroepen. Voor deze functie moeten we een implementatie maken van de IClassFactory waarmee een klasseobject wordt gemaakt voor onze FeedProvider-klasse . We zullen onze klassefaciliteit in een zelfstandige hulpklasse implementeren.
Klik in Visual Studio met de rechtermuisknop op het ExampleFeedProvider-project in de Solution Explorer en selecteer Toevoegen->Klasse. Geef in het dialoogvenster Klasse toevoegen de klasse De naam FactoryHelper en klik op Toevoegen.
Vervang de inhoud van het bestand FactoryHelper.cs door de volgende code. Deze code definieert de IClassFactory-interface en implementeert de twee methoden , CreateInstance en LockServer. Deze code is typisch standaard voor het implementeren van een klassefactory en is niet specifiek voor de functionaliteit van een feedprovider, behalve dat we aangeven dat het klasseobject dat wordt gemaakt, de IFeedProvider-interface implementeert.
// 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;
}
}
Het klasseobject van de feedprovider registreren bij OLE
In het bestand Program.cs voor ons uitvoerbare bestand roepen we CoRegisterClassObject aan om onze feedprovider te registreren bij OLE, zodat het widgetsbord ermee kan communiceren. Vervang de inhoud van Program.cs door de volgende code. Dit maakt gebruik van de FeedProviderFactory-interface die we in een vorige stap hebben gedefinieerd om de FeedProvider-helperklasse te registreren. Voor foutopsporing roept dit voorbeeld GetEnabledFeedProviders aan op het standaard FeedManager-exemplaar om een lijst met FeedProviderInfo-objecten op te halen die de ingeschakelde feedproviders vertegenwoordigen. De functie doorloopt de ingeschakelde feedproviders met behulp van de eigenschap EnabledFeedDefinitionIds om alle ingeschakelde feed-id's weer te geven.
// 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.");
}
}
}
}
In dit codevoorbeeld wordt de functie GetConsoleWindow geïmporteerd om te bepalen of de app wordt uitgevoerd als consoletoepassing, het standaardgedrag voor dit scenario. Als de functie een geldige aanwijzer retourneert, schrijven we foutopsporingsgegevens naar de console. Anders wordt de app uitgevoerd als een Windows-app. In dat geval wachten we op de gebeurtenis die we hebben ingesteld in de methode OnFeedProviderDisabled wanneer de lijst met ingeschakelde feedproviders leeg is en de app wordt afgesloten. Zie Uw console-app converteren naar een Windows-app voor meer informatie over het converteren van de voorbeeldconsole-app naar een Windows-app.
Uw feedprovider-app verpakken
In de huidige release kunnen alleen verpakte apps worden geregistreerd als feedproviders. Met de volgende stappen wordt u begeleid bij het verpakken van uw app en het bijwerken van het app-manifest om uw app te registreren bij het besturingssysteem als feedprovider.
Een MSIX-pakketproject maken
Klik in Solution Explorer met de rechtermuisknop op uw oplossing en selecteer Add-New> Project.... Selecteer in het dialoogvenster Een nieuw project toevoegen de sjabloon Windows Application Packaging Project en klik op Volgende. Stel de projectnaam in op 'ExampleFeedProviderPackage' en klik op Maken. Wanneer u hierom wordt gevraagd, stelt u de doelversie in op build 22621 of hoger en klikt u op OK. Klik vervolgens met de rechtermuisknop op het project ExampleFeedProviderPackage en selecteer Projectreferentie toevoegen>. Selecteer het project ExampleFeedProvider en klik op OK.
Windows App SDK-pakketreferentie toevoegen aan het pakketproject
U moet een verwijzing toevoegen naar het NuGet-pakket van de Windows App SDK aan het MSIX-verpakkingsproject. Dubbelklik in Solution Explorer op het project ExampleFeedProviderPackage om het bestand ExampleFeedProviderPackage.wapproj te openen. Voeg de volgende XML toe in het Project-element .
<!--ExampleWidgetProviderPackage.wapproj-->
<ItemGroup>
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.5.231116003-experimentalpr">
<IncludeAssets>build</IncludeAssets>
</PackageReference>
</ItemGroup>
Opmerking
Zorg ervoor dat de versie die is opgegeven in het element PackageReference overeenkomt met de meest recente stabiele versie waarnaar u in de vorige stap hebt verwezen.
Als de juiste versie van de Windows App SDK al op de computer is geïnstalleerd en u de SDK-runtime niet in uw pakket wilt bundelen, kunt u de pakketafhankelijkheid opgeven in het bestand Package.appxmanifest voor het project 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>
...
Het pakketmanifest bijwerken
Klik in Solution Explorer met de rechtermuisknop op het Package.appxmanifest bestand en selecteer Code weergeven om het XML-manifestbestand te openen. Vervolgens moet u enkele naamruimtedeclaraties toevoegen voor de app-pakketextensies die we gaan gebruiken. Voeg de volgende naamruimtedefinities toe aan het element Package op het hoogste niveau.
<!-- Package.appmanifest -->
<Package
...
xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
xmlns:com="http://schemas.microsoft.com/appx/manifest/com/windows10"
Maak in het toepassingselement een nieuw leeg element met de naam Extensies. Zorg ervoor dat dit komt na de afsluitende tag voor uap:VisualElements.
<!-- Package.appxmanifest -->
<Application>
...
<Extensions>
</Extensions>
</Application>
De eerste extensie die we moeten toevoegen, is de ComServer-extensie . Hiermee wordt het toegangspunt van het uitvoerbare bestand geregistreerd bij het besturingssysteem. Deze extensie is het pakket-app-equivalent van het registreren van een COM-server door een registersleutel in te stellen en is niet specifiek voor widgetproviders. Voeg het volgende com:Extension-element toe als onderliggend element van het element Extensies . Wijzig de GUID in het kenmerk Id van het element com:Class in de GUID die u in een vorige stap hebt gegenereerd bij het definiëren van de FeedProvider-klasse .
<!-- 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>
Voeg vervolgens de extensie toe waarmee de app wordt geregistreerd als feedprovider. Plak het element uap3:Extension in het volgende codefragment als een onderliggend element van het element Extensions . Vervang het kenmerk ClassId van het COM-element door de GUID die u in de vorige stappen hebt gebruikt.
<!-- 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>
Zie xml-indeling van feedproviderpakketten voor gedetailleerde beschrijvingen en indelingen voor al deze elementen.
Uw feedprovider testen
Zorg ervoor dat u de architectuur hebt geselecteerd die overeenkomt met uw ontwikkelcomputer in de vervolgkeuzelijst Oplossingsplatformen , bijvoorbeeld 'x64'. Klik in Solution Explorer met de rechtermuisknop op uw oplossing en selecteer Oplossing bouwen. Zodra dit is gebeurd, klikt u met de rechtermuisknop op uw ExampleWidgetProviderPackage en selecteert u Implementeren. De console-app moet worden gestart bij de implementatie en u ziet dat de feeds zijn ingeschakeld in de console-uitvoer. Open het widgetsbord en u ziet de nieuwe feeds in de tabbladen boven aan de sectie Feeds.
Het opsporen van fouten in uw feedprovider
Nadat u uw feeds hebt vastgemaakt, start het widgetplatform uw feedprovidertoepassing om relevante informatie over de feed te ontvangen en te verzenden. Als u fouten wilt opsporen in de actieve feed, kunt u een foutopsporingsprogramma toevoegen aan de toepassing van de actieve feedprovider of u kunt Visual Studio instellen om automatisch de foutopsporing van het feedproviderproces te starten zodra deze is gestart.
Om u aan het lopende proces te koppelen:
- Klik in Visual Studio op Debuggen -> Koppelen aan proces.
- Filter de processen en zoek de gewenste feedprovidertoepassing.
- Voeg het foutopsporingsprogramma toe.
Als u het foutopsporingsprogramma automatisch wilt koppelen aan het proces wanneer het in eerste instantie wordt gestart:
- Klik in Visual Studio op Foutopsporing -> Andere foutopsporingsdoelen -> Gedebugged app-pakket.
- Filter de pakketten en zoek het gewenste feedproviderpakket.
- Selecteer het en vink het vakje aan met de tekst 'Niet starten, maar debug mijn code wanneer het start.'
- Klik op ombij te voegen.
Uw console-app converteren naar een Windows-app
Als u de console-app wilt converteren die in dit scenario is gemaakt naar een Windows-app, klikt u met de rechtermuisknop op het project ExampleFeedProvider in Solution Explorer en selecteert u Eigenschappen. Wijzig onder Toepassings-algemeen> het uitvoertype van 'Consoletoepassing' in 'Windows-toepassing'.
Uw feedprovider-app publiceren
Nadat u uw feedprovider hebt ontwikkeld en getest, kunt u uw app publiceren in de Microsoft Store, zodat gebruikers uw feeds op hun apparaten kunnen installeren. Zie Uw app publiceren in de Microsoft Store voor stapsgewijze instructies voor het publiceren van een app.
De verzameling Feeds Store
Nadat uw app is gepubliceerd in de Microsoft Store, kunt u aanvragen dat uw app wordt opgenomen in de Store-feedverzameling waarmee gebruikers apps kunnen detecteren die Windows-feeds bevatten. Om uw verzoek in te dienen, zie Uw feed/bord indienen voor toevoeging aan de Storecollectie.
Windows developer