Del via


Opret Power Automate til skrivebordshandlinger ved hjælp af Handlings-SDK

Denne artikel beskriver, hvordan du opretter tilpassede handlinger i Power Automate til desktop.

Oprette brugerdefinerede handlinger

Vigtigt

Reserverede søgeord kan ikke bruges som handlingsnavne og/eller handlingsegenskaber. Brug af reserverede søgeord som handlingsnavne og/eller handlingsegenskaber resulterer i fejlagtig adfærd. Flere oplysninger: Reserverede søgeord i desktop-flows

Begynd at oprette et nyt klassebiblioteksprojekt (.NET Framework). Vælg .NET Framework version 4.7.2.

Sådan oprettes en handling i det brugerdefinerede modul, der oprettes:

  • Slet den automatisk genererede Class1.cs fil.
  • Opret en ny klasse i projektet, der repræsenterer den brugerdefinerede handling, og giv den et tydeligt navn.
  • Inkluder Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.SDK og Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.SDK.Attributes namespaces.
  • Alle klasser, der repræsenterer handlinger, skal have en [Handling]-attribut over din klasse.
  • Klasserne skal have offentlig adgang og arve fra ActionBase-klasse.
using System;
using Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.SDK;
using Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.SDK.Attributes;

namespace Modules.MyCustomModule
{
    [Action(Id = "CustomAction")]
    public class CustomAction : ActionBase
    {
        public override void Execute(ActionContext context)
        {
            throw new NotImplementedException();
        }
    }
}

Fleste handlinger kan have parametre (Input eller Output). Input- og outputparametre repræsenteres ved klassisk C#-egenskaber. De enkelte egenskaber skal have den rette C#-attribut [InputArgument] eller [OutputArgument] til at bestemme typen, og hvordan de vises på Power Automate til skrivebordet. Inputargumenter kan også have standardværdier.

using System.ComponentModel;
using Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.SDK;
using Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.SDK.Attributes;

namespace Modules.MyCustomModule
{
    [Action(Id = "CustomAction")]
    public class CustomAction : ActionBase
    {
        [InputArgument, DefaultValue("Developer")]
        public string InputName { get; set; }

        [OutputArgument]
        public string DisplayedMessage { get; set; }

        public override void Execute(ActionContext context)
        {
            DisplayedMessage = $"Hello, {InputName}";
        }
    }
}

Tilføjelse af beskrivelser til brugerdefinerede handlinger

Tilføj en beskrivelse og et fuldt navn til modulerne og handlingerne, så RPA-udviklere ved, hvordan de bedst udnytter dem.

Power Automate til desktopdesigner viser fulde navne og beskrivelser.

Du kan oprette en "Resources.resx" fil i mappen Egenskaber i modulprojektet. Den nye ".resx"-fil skal have navnet "Resources.resx".

Beskrivelsesformatet for moduler og handlinger skal være følgende:

Henholdsvis "Module_Description" eller "Action_Description" og "Module_FriendlyName" eller "Action_FriendlyName" i navnefeltet. Beskrivelsen i værdifeltet.

Vi anbefaler også, at du angiver beskrivelser og venlige navne til parametre. Formatet skal være følgende: "Action_Parameter_Description", "Action_Parameter_FriendlyName".

Skærmbillede af ressourcer for en simpel handling

Tip

Det anbefales, at du angiver, hvad det er, du beskriver i kommentarfeltet (f.eks. modul, handling osv.)

De kan også angives med egenskaberne FriendlyName og Beskrivelse for attributterne [InputArgument][OutputArgument] og [Action].

Her er et eksempel på en Resources.resx-fil til et brugerdefineret modul.

Skærmbillede af ressourcer

En anden måde at føje fulde navne og beskrivelser til handlinger og parametre på er ved hjælp af egenskaberne FriendlyName og Beskrivelse i [Handling][InputArguement] og [OutputArguement]-attributter.

Bemærk

Hvis du vil føje et fuldt navn og en beskrivelse til et modul, skal du ændre den pågældende .resx-fil eller tilføje de respektive C#-attributter.

Ressourcelokalisering

Standardsproget for moduler i Power Automate til desktop antages at være engelsk.

Filen Resources.resx skal være på engelsk.

Alle andre sprog kan tilføjes med ekstra ressourcer.{locale}.resx-filer, der skal lokaliseres. Eksempel Resources.fr.resx.

Brugerdefinerede modulkategorier

Moduler kan omfatte kategorier og underkategorier for at opnå en bedre handlingsorganisation.

Hvis du vil adskille brugerdefinerede handlinger i kategorier, skal du ændre attributten [Handling], der er før den klasse, der repræsenterer den brugerdefinerede handling, på følgende måde:

[Action(Category = "category.subcategory")]

Bemærk

Et modul kan have flere kategorier. På samme måde kan kategorier består af underkategorier. Denne struktur kan være ubestemt.

Egenskaben Ordre bestemmer den rækkefølge, som handlinger vises i i designeren.

Action1 hører til i kategorien "TestCategory", og det er den første handling i modulet (på denne måde forklarer du ordre og kategori med et eksempel).

[Action(Id = "Action1", Order = 1, Category = "TestCategory")]

Betingede handlinger

Betingede handlinger er handlinger, der enten returnerer "Sand" eller "Falsk". 'Hvis filen findes' er Power Automate til skrivebordshandling i standardbiblioteket et godt eksempel på en betinget handling.

Eksempel på Betinget handling:

using Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.SDK;
using Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.SDK.Attributes;
using System;
using System.ComponentModel;

namespace Modules.CustomModule
{
    [ConditionAction(Id = "ConditionalAction1", ResultPropertyName = nameof(Result))]
    [Throws("ActionError")] // TODO: change error name (or delete if not needed)
    public class ConditionalAction1 : ActionBase
    {
        #region Properties

        public bool Result { get; private set; }

        [InputArgument]
        public string InputArgument1 { get; set; }

        #endregion

        #region Methods Overrides

        public override void Execute(ActionContext context)
        {
            try
            {
                //TODO: add action execution code here
            }
            catch (Exception e)
            {
                if (e is ActionException) throw;

                throw new ActionException("ActionError", e.Message, e.InnerException);
            }
        }

        #endregion
    }
}

Bemærk den booleske variabel Resultat.

Handlingen Hvis filen findes, har den ikke et outputargument. Det, der returneres, er enten sand eller falsk, afhængigt af hvad den booleske variabel Resultat indeholder.

Brugerdefinerede handlingsvælgere

Der er særlige tilfælde, hvor der kan kræves en brugerdefineret handling for at have mere end én handling.

Et eksempel er handlingen "Start Excel" fra standardbiblioteket for handlinger.

Hvis du bruger vælgeren "med et tomt dokument", startes der et tomt Excel-dokument i flowet, mens valg af "og åbn følgende dokument" kræver, at filens filsti åbnes.

Skærmbillede af handlingsvælgere Start Excel

De to handlinger, der er nævnt ovenfor, er to vælgere af basishandlingen "Start Excel".

Når du opretter brugerdefinerede handlinger, behøver du ikke at omskrive funktionaliteten.

Du kan oprette en enkelt "basishandling", angive input- og outputparametrene og derefter vælge, hvad der skal være synligt i hver enkelt handling ved hjælp af handlingsvælgere.

Via handlingsvælgere kan der tilføjes et niveau af indlæsning over en enkelt handling, hvilket gør det muligt at hente bestemte funktioner fra den enkelte "basishandling" uden at skulle skrive kode igen for at danne en ny enhed af samme handling hver gang.

Tænk på vælgere som valgmuligheder, filtrering af en enkelt handling og kun præsentation af de oplysninger, der kræves i henhold til de respektive vælgere.

Skærmbillede af en handlingsvælgers dialogboks

Hvis du vil oprette en ny handlingsvælger, skal du først oprette en basishandling, der skal bruges af vælgerne.

Den centrale handling kræver enten en boolesk eller en optællingsegenskab som et input C#-argument.

Værdien af denne egenskab bestemmer, hvilken vælger der anvendes.

Den mest almindelige måde er at bruge en optælling på. Især når der er brug for mere end to vælgere, er optællinger den eneste indstilling.

I forbindelse med to vælgersager kan booleske adapter bruges.

Denne egenskab, som også kaldes et begrænsningsargument, skal have en standardværdi.

Den centrale handling anvendes som en klassisk handling.

Bemærk, at den første egenskab (inputargument) er en fasttekst. Afhængigt af værdien i den pågældende egenskab bliver den relevante vælger aktiv.

Bemærk

Hvis du vil have ordnet argumenterne på den ønskede måde, skal du angive værdien Ordre ud for attributten InputArgument.

using System.ComponentModel;
using Microsoft.PowerPlatform.PowerAutomate.Desktop.Desktop.Actions.SDK;
using Microsoft.PowerPlatform.PowerAutomate.Desktop.Desktop.Actions.SDK.Attributes;

namespace Modules.CustomModule
{
    [Action(Id = "CentralCustomAction")]
    public  class CentralCustomAction : ActionBase
    {
        #region Properties

        [InputArgument, DefaultValue(SelectorChoice.Selector1)]
        public SelectorChoice Selector { get; set; }

        [InputArgument(Order = 1)]
        public string FirstName { get; set; }

        [InputArgument(Order = 2)]
        public string LastName { get; set; }

        [InputArgument(Order = 3)]
        public int Age { get; set; }

        [OutputArgument]
        public string DisplayedMessage { get; set; }

        #endregion

        #region Methods Overrides

        public override void Execute(ActionContext context)
        {
            if (Selector == SelectorChoice.Selector1)
            {
                DisplayedMessage = $"Hello, {FirstName}!";
            }
            else if (Selector == SelectorChoice.Selector2)
            {
                DisplayedMessage = $"Hello, {FirstName} {LastName}!";
            }
            else // The 3rd Selector was chosen 
            {
                DisplayedMessage = $"Hello, {FirstName} {LastName}!\nYour age is: {Age}";
            }
        }

        #endregion
    } // you can see below how to implement an action selector
}

Brugerdefinerede handlingsvælgere ved hjælp af fasttekst

I dette eksempel opretter du tre vælgere. En simpel optælling bestemmer den rette vælger hver gang:

public enum SelectorChoice
{
    Selector1,
    Selector2,
    Selector3
}

Vælgere repræsenteres ved klasser.

Disse klasser skal arve ActionSelector<TBaseActionClass>-klassen.

Bemærk

TBaseActionClass er navnet på basishandlingsklassen.

I metoden UseName() er navnet på handlingsvælgeren angivet på en anden måde. Bruges som navnet på handlingen for at løse ressourcen.

public class Selector1 : ActionSelector<CentralCustomAction>
{
    public Selector1()
    {
        UseName("DisplayOnlyFirstName");
        Prop(p => p.Selector).ShouldBe(SelectorChoice.Selector1);
        ShowAll();
        Hide(p => p.LastName);
        Hide(p => p.Age);
        // or 
        // Show(p => p.FirstName); 
        // Show(p => p.DisplayedMessage);
    }
}

Bemærk

Klasserne Vælger skal ikke erklæres som handlinger. Den eneste handling er den centrale handling. Vælgere fungerer som filtre.

I dette specifikke eksempel vil vi kun vise ét af argumenterne, og derfor filtreres de andre ud. På samme måde gælder selector2:

public class Selector2 : ActionSelector<CentralCustomAction>
{
    public Selector2()
    {
        UseName("DisplayFullName");
        Prop(p => p.Selector).ShouldBe(SelectorChoice.Selector2);
        ShowAll();
        Hide(p => p.Age);
    }
}

Og Selector3-klasser:

public class Selector3 : ActionSelector<CentralCustomAction>
{
    public Selector3()
    {
        UseName("DisplayFullDetails");
        Prop(p => p.Selector).ShouldBe(SelectorChoice.Selector3);
        ShowAll();
    }
}

Den endelige udførelse udføres ved hjælp af metoden Execute(ActionContext context), der findes i den centrale handling. Afhængigt af vælgeren vises de respektive filtrerede værdier.

public override void Execute(ActionContext context)
{
    if (Selector == SelectorChoice.Selector1)
    {
        DisplayedMessage = $"Hello, {FirstName}!";
    }
    else if (Selector == SelectorChoice.Selector2)
    {
        DisplayedMessage = $"Hello, {FirstName} {LastName}!";
    }
    else // The 3rd Selector was chosen 
    {
        DisplayedMessage = $"Hello, {FirstName} {LastName}!\nYour age is: {Age}";
    }
}

Brugerdefinerede handlingsvælgere bruger boolesk

Følgende er et eksempel, hvor der bruges boolesk i stedet for fasttekst.

using System.ComponentModel;
using Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.SDK;
using Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.SDK.ActionSelectors;
using Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.SDK.Attributes;

namespace Modules.CustomModule
{
    [Action]
    public class CentralCustomActionWithBoolean : ActionBase
    {
        #region Properties

        [InputArgument, DefaultValue(true)]
        public bool TimeExpired { get; set; }

        [InputArgument]
        public string ElapsedTime { get; set; }

        [InputArgument]
        public string RemainingTime { get; set; }

        [OutputArgument]
        public string DisplayedMessage { get; set; }

        #endregion

        #region Methods Overrides

        public override void Execute(ActionContext context)
        {
            DisplayedMessage = TimeExpired ? $"The timer has expired. Elapsed time: {ElapsedTime}" : $"Remaining time: {RemainingTime}";
        }

        #endregion
    }

    public class NoTime : ActionSelector<CentralCustomActionWithBoolean>
    {
        public NoTime()
        {
            UseName("TimeHasExpired");
            Prop(p => p.TimeExpired).ShouldBe(true);
            ShowAll();
            Hide(p => p.RemainingTime);
        }
    }

    public class ThereIsTime : ActionSelector<CentralCustomActionWithBoolean>
    {
        public ThereIsTime()
        {
            UseName("TimeHasNotExpired");
            Prop(p => p.TimeExpired).ShouldBe(false);
            ShowAll();
            Hide(p => p.RemainingTime);
        }
    }
}

Angivelse af beskrivelser for brugerdefinerede handlingsvælgere

Hvis du vil oprette en beskrivelse og en oversigt for vælgere, skal du bruge følgende format i .resx-filen i det brugerdefinerede modul.

SelectorName_Description
SelectorName_Summary

Det kan du også gøre i vælgeren med metoderne WithDescription og WithSummary.

Vigtigt

.dll-filerne, der beskriver brugerdefinerede handlinger, deres afhængighed af .dll-filer og .cab-filerne, er korrekt signeret med et digitalt certifikat, der er tillid til af organisationen. Certifikatet skal også installeres på alle de computere, hvor et desktopflow med brugerdefinerede handlingsafhængigheder oprettes/ændres/køres, og som findes under nøglecenter, der er tillid til.

Brugerdefinerede modul-id'er

Hvert modul har sit eget id (assembly-navn). Når du opretter brugerdefinerede moduler, skal du sørge for at angive entydige modul-id'er. Hvis du vil angive assembly-navnet på modulet, skal du ændre egenskaben for Assembly-navn under afsnittet Generelt i egenskaberne for C#-projektet.

Advarsel!

Hvis der inkluderes moduler med samme id i et flow, opstår der konflikter

Brugerdefinerede regler for modulnavn

Hvis de brugerdefinerede moduler skal kunne læses gennem Power Automate til skrivebordet, skal AssemblyName have et filnavn, der følger nedenstående mønster:

?*.Modules.?*
Modules.?*

f.eks. Moduler.ContosoActions.dll

AssemblyTitle i projektindstillingerne angiver modul-id'et. Den må kun indeholde alfanumeriske tegn og understregningstegn, og den skal starte med et bogstav.

Signer alle DLL-adresser i det brugerdefinerede modul

Vigtigt!

Det er obligatorisk, at alle .dll-filerne udgør et brugerdefineret modul (genereret assembly og alle afhængigheder) signeret med et certifikat, der er tillid til

Hvis du vil afslutte oprettelsen af det brugerdefinerede modul, skal alle genererede .dll-filer, som findes under mappen bin/release eller bin/Debug i projektet, signeres.

Log på alle .dll-filerne ved hjælp af et certifikat, der er tillid til, ved at køre følgende kommando (for hver .dll-fil) i en kommandoprompt til udviklere i Visual Studio:

Log på alle .dll-filerne ved hjælp af et certifikat, der er tillid til, ved at køre følgende kommando (for hver .dll-fil) i en kommandoprompt til udviklere i Visual Studio:

Signtool sign /f {your certificate name}.pfx /p {your password for exporting the certificate} /fd 
SHA256 {path to the .dll you want to sign}.dll

Eller ved at køre følgende kommando (ved at oprette et Windows PowerShell Script .ps1), der køres via alle .dll-filer, og signere dem alle med det medfølgende certifikat:

Get-ChildItem {the folder where dll files of custom module exist} -Filter *.dll | 
Foreach-Object {
	Signtool sign /f {your certificate name}.pfx /p {your password for exporting the certificate} /fd SHA256 $_.FullName
}

Bemærk

Digitale certifikater skal have en privat nøgle, der kan eksporteres og kodetegn, der kan eksporteres

Pakke alt i en kabinetfil

.dll, der indeholder de brugerdefinerede handlinger og alle afhængigheder (.dll-filer), skal pakkes i en kabinetfil (.cab).

Bemærk

Når du navngive .cab-filen, skal du følge navngivningskonventionen for filer og mapper for Windows-operativsystemet. Brug ikke mellemrum eller specialtegn som f.eks. < > : " / \ | ? * .

Opret et Windows PowerShell Script (.ps1), der indeholder følgende linjer:

param(

    [ValidateScript({Test-Path $_ -PathType Container})]
	[string]
	$sourceDir,
	
	[ValidateScript({Test-Path $_ -PathType Container})]
    [string]
    $cabOutputDir,

    [string]
    $cabFilename
)

$ddf = ".OPTION EXPLICIT
.Set CabinetName1=$cabFilename
.Set DiskDirectory1=$cabOutputDir
.Set CompressionType=LZX
.Set Cabinet=on
.Set Compress=on
.Set CabinetFileCountThreshold=0
.Set FolderFileCountThreshold=0
.Set FolderSizeThreshold=0
.Set MaxCabinetSize=0
.Set MaxDiskFileCount=0
.Set MaxDiskSize=0
"
$ddfpath = ($env:TEMP + "\customModule.ddf")
$sourceDirLength = $sourceDir.Length;
$ddf += (Get-ChildItem $sourceDir -Filter "*.dll" | Where-Object { (!$_.PSIsContainer) -and ($_.Name -ne "Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.SDK.dll") } | Select-Object -ExpandProperty FullName | ForEach-Object { '"' + $_ + '" "' + ($_.Substring($sourceDirLength)) + '"' }) -join "`r`n"
$ddf | Out-File -Encoding UTF8 $ddfpath
makecab.exe /F $ddfpath
Remove-Item $ddfpath

Dette Windows PowerShell-script kan derefter bruges til at oprette .cab-filen ved at aktivere den i Windows PowerShell og angive følgende:

  • Mappen til de .dll-filer, der skal komprimeres.
  • Den destinationsmappe, der skal placere den oprettede .cab-fil.

Kald scriptet ved hjælp af følgende syntaks:

.\{name of script containing the .cab compression directions}.ps1 "{absolute path  to the source directory containing the .dll files}" "{target dir to save cab}" {cabName}.cab

Eksempel:

.\makeCabFile.ps1 "C:\Users\Username\source\repos\MyCustomModule\bin\Release\net472" "C:\Users\Username\MyCustomActions" MyCustomActions.cab

Bemærk

  • Kontrollér, at den faktiske .dll-fil med brugerdefinerede handlinger findes på rodniveauet for målstien, når du opretter .cab-filen, og ikke i en undermappe.
  • .cab-filen skal også være signeret. Ikke-signerede .cab-filer og/eller ikke-signerede .dll-filer, der findes i dem, kan ikke bruges i skrivebordsforløb, og de opstår fejl under inkluderingen.

Næste trin

Upload brugerdefinerede handlinger

Se også