Today I wrote a program to successfully launch any .exe programs from UWP. Want to share the process for the benefit of others. This is in addition to the answer by stefan Wick MSFT. First the package.appmanifest needs to be updated. This is what I have in package.appmanifest:
<?xml version="1.0" encoding="utf-8"?>
<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
IgnorableNamespaces="uap mp">
<Identity
Name="217d09c4-aa67-4403-939f-518a55d46f16"
Publisher="CN=admin"
Version="1.0.0.0" />
<mp:PhoneIdentity PhoneProductId="217d09c4-aa67-4403-939f-518a55d46f16" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
<Properties>
<DisplayName>App1</DisplayName>
<PublisherDisplayName>admin</PublisherDisplayName>
<Logo>AssetsStoreLogo.png</Logo>
</Properties>
<Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.14393.0" MaxVersionTested="10.0.16299.0" />
</Dependencies>
<Resources>
<Resource Language="x-generate"/>
</Resources>
<Applications>
<Application Id="App"
Executable="$targetnametoken$.exe"
EntryPoint="App1.App">
<uap:VisualElements
DisplayName="App1"
Square150x150Logo="AssetsSquare150x150Logo.png"
Square44x44Logo="AssetsSquare44x44Logo.png"
Description="App1"
BackgroundColor="transparent">
<uap:DefaultTile Wide310x150Logo="AssetsWide310x150Logo.png"/>
<uap:SplashScreen Image="AssetsSplashScreen.png" />
</uap:VisualElements>
<Extensions>
<desktop:Extension Category="windows.fullTrustProcess" Executable="AssetsLauncher.exe" >
<desktop:FullTrustProcess>
<desktop:ParameterGroup GroupId="ChromeGroup" Parameters="chrome.exe"/>
<desktop:ParameterGroup GroupId="WordGroup" Parameters="WINWORD.exe"/>
</desktop:FullTrustProcess>
</desktop:Extension>
</Extensions>
</Application>
</Applications>
<Capabilities>
<Capability Name="internetClient"/>
<rescap:Capability Name="runFullTrust" />
</Capabilities>
</Package>
The code within the <Extensions>
tag is the one responsible for launching the executable files. The code with <Capabilities>
tag add capability or permission to launch the executable.The restrictive capabilities like runFullTrust
is having green green line below it. It is not a error and program will run without any error. The Launcher.exe
in the above code is a console app. I write the code in the text editor and created Launcher.exe from it. The code of the Launcher.exe is this:
using System;
using System.IO;
using System.Diagnostics;
using System.Reflection;
class Program
{
static void Main(string []args)
{
try
{
if(args.Length!=0)
{
string executable=args[2];
/*uncomment the below three lines if the exe file is in the Assets
folder of the project and not installed with the system*/
/*string path=Assembly.GetExecutingAssembly().CodeBase;
string directory=Path.GetDirectoryName(path);
process.Start(directory+""+executable);*/
Process.Start(executable);
}
}
catch(Exception e)
{
Console.WriteLine(e.Message);
Console.ReadLine();
}
}
}
Saved this Launcher.exe console app in Assets folder of the UWP project. UWP is not allowed to launch .exe apps. But UWP app calls this code to launch any .exe program. The GroupId ChromeGroup is used to launch chrome browser by passing chrome.exe parameter to the Launcher.exe. The GroupId WordGroup is used to launch MS Word by passing WINWORD.exe parameter to Launcher.exe. The code to pass the parameter to Launcher.exe is :
`private async void Button_Click(object sender, RoutedEventArgs e)
{
await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync("ChromeGroup");
await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync("WordGroup");
}`
On the click of a button above Api
pass on the name of the exe file to Launcher.exe
program. It do this by accepting GroupId
as parameter. The Api
is available under Windows.ApplicationModel
NameSpace.
EDIT:
The executable you want to launch may not be installed on system. It may not be packaged with your application in Assets folder. Than you can give full path of the executable in the Parameters
attribute.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…