Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
169 views
in Technique[技术] by (71.8m points)

c# - UWP: how to start an exe file that is located in specific directory?

I am trying to start an exe that is located in C:/Program Files (x86)/App from UWP app. How can I do this.

I can start exe file by using Windows Desktop extension for UWP, add Hide Copy Code

<Extensions>
        <desktop:Extension Category="windows.fullTrustProcess"          Executable="Assetsapp.exe" />
</Extensions>

to Package.appmanifest and call this

await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();

in main class. But I need to add app.exe to Assets directory of project
My question is if exe file is located in other directory, how can I start it without adding exactly the exe file.
Thanks

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...