c# - UWP:如何启动位于特定目录中的 exe 文件?

标签 c# uwp windows-10-universal

我正在尝试从 UWP 应用启动位于 C:/Program Files (x86)/App 中的 exe。我该怎么做。

我可以使用 UWP 的 Windows 桌面扩展来启动 exe 文件,添加 隐藏复制代码

<Extensions>
        <desktop:Extension Category="windows.fullTrustProcess"          Executable="Assets\app.exe" />
</Extensions>

到 Package.appmanifest 并调用它

await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();

在主类中。但是我需要将 app.exe 添加到项目的 Assets 目录
我的问题是,如果 exe 文件位于其他目录中,我如何在不准确添加 exe 文件的情况下启动它。
谢谢

最佳答案

今天我编写了一个程序来成功地从 UWP 启动任何 .exe 程序。想要分享这个过程以造福他人。这是对 stefan Wick MSFT 的回答的补充。首先需要更新 package.appmanifest。这是我在 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>Assets\StoreLogo.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="Assets\Square150x150Logo.png"
        Square44x44Logo="Assets\Square44x44Logo.png"
        Description="App1"
        BackgroundColor="transparent">
        <uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png"/>
        <uap:SplashScreen Image="Assets\SplashScreen.png" />
      </uap:VisualElements>

        <Extensions>

          <desktop:Extension Category="windows.fullTrustProcess" Executable="Assets\Launcher.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>

<Extensions> 内的代码标签是负责启动可执行文件的标签。带有<Capabilities>的代码标签添加启动可执行文件的能力或权限。限制性能力如runFullTrust它下面有绿色的绿线。这不是错误,程序将运行而不会出现任何错误。 Launcher.exe上面的代码中是一个控制台应用程序。我在文本编辑器中编写代码并从中创建 Launcher.exe。 Launcher.exe 的代码是这样的:

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();
    }

    }
    }

将此 Launcher.exe 控制台应用程序保存在 UWP 项目的 Assets 文件夹中。不允许 UWP 启动 .exe 应用程序。但是 UWP 应用调用此代码来启动任何 .exe 程序。 GroupId ChromeGroup 用于通过将 chrome.exe 参数传递给 Launcher.exe 来启动 chrome 浏览器。 GroupId WordGroup 用于通过将 WINWORD.exe 参数传递给 Launcher.exe 来启动 MS Word。将参数传递给 Launcher.exe 的代码是:

`private async void Button_Click(object sender, RoutedEventArgs e)
{
await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync("ChromeGroup");
await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync("WordGroup");
}`

点击上方的按钮 Api将 exe 文件的名称传递给 Launcher.exe程序。它通过接受 GroupId 来做到这一点作为参数。 ApiWindows.ApplicationModel 下可用命名空间。

编辑:

您要启动的可执行文件可能未安装在系统上。它可能不会与您的应用程序一起打包在 Assets 文件夹中。你可以在 Parameters 中给出可执行文件的完整路径属性。

关于c# - UWP:如何启动位于特定目录中的 exe 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49189353/

相关文章:

c# - 当您在需要 Expression 的地方使用自定义方法时,如何创建 C# 编译错误?

c++ - 在 UWP 应用程序中包含第三方 DLL - 一步一步?

http - 使用 HttpClient 阻止下载整个远程资源?

c# - 在 C# 中使用 speex 预处理器的最简单方法?

c# - 自动指示 ToolTipStatusLabel 中的截断

c# - 单个 View 中的多个模型 : submit failure

windows-10 - 如何从内置日历应用程序中隐藏我的应用程序日历?

c# - 运行从 C# 应用程序最小化的 Metro 应用程序

c# - "Access is denied"在 UWP (C#) 中尝试运行桌面扩展应用程序时

c# - Activator.CreateInstance(type) 抛出异常