我正在尝试从UWP应用程序启动位于C:/ Program Files(x86)/ App中的exe。我怎么能这样做。
我可以使用Windows桌面扩展为UWP启动exe文件,添加 隐藏复制代码
<Extensions>
<desktop:Extension Category="windows.fullTrustProcess" Executable="Assets\app.exe" />
</Extensions>
到Package.appmanifest并调用此
await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();
在主要班级。但是我需要将app.exe添加到项目的Assets目录中 我的问题是如果exe文件位于其他目录中,如何在不添加exe文件的情况下启动它 感谢
答案 0 :(得分:7)
今天我写了一个程序来成功启动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
NameSpace下可用。
修改强>
您要启动的可执行文件可能未安装在系统上。它可能无法与您的应用程序一起打包在Assets文件夹中。您可以在Parameters
属性中提供可执行文件的完整路径。
答案 1 :(得分:1)
您无法从UWP应用程序进程中启动任意EXE。您可以做的是在您自己的包中启动您自己的完全信任EXE(正如您已经发现的那样)。然后,您可以从该EXE启动任意EXE(假设用户具有访问它的权限)。因此,对于任意情况下的这种情况,这是一个两步过程。
更好的选择是通过协议启动另一个应用程序(但如果你不拥有它,或者它不支持协议激活,这可能并不总是一个选项。)