我正在尝试从 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
来做到这一点作为参数。 Api
在 Windows.ApplicationModel
下可用命名空间。
编辑:
您要启动的可执行文件可能未安装在系统上。它可能不会与您的应用程序一起打包在 Assets 文件夹中。你可以在 Parameters
中给出可执行文件的完整路径属性。
关于c# - UWP:如何启动位于特定目录中的 exe 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49189353/