我有一个Java 9应用程序,我正在尝试为Windows应用商店打包.奇怪的是,当我直接运行exe-launcher时,它按预期工作,但是当我通过APPX包运行启动器时,我得到以下奇怪的错误:
Exception in thread "Swing-Shell" java.lang.InternalError: Could not
initialize COM: HRESULT=0x80010106
at java.desktop/sun.awt.shell.Win32ShellFolderManager2.initializeCom(Native Method)
at java.desktop/sun.awt.shell.Win32ShellFolderManager2$ComInvoker$1.run(Unknown Source at java.base/java.lang.Thread.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
HRESULT=0x80010106意味着RPC_E_CHANGED_MODE我猜意味着COM以某种方式已经在MTA模式初始化.但为什么这只是Windows Bridge沙箱中的一个问题?pre-initialize出于某种原因,Windows桥以某种方式某种程度上是COM吗?
我不确定这是Java 9问题,还是Desktop Bridge问题,或两者兼而有之.有没有人对如何确定问题的原因或解决方法有任何想法?
我已经制作了一个最小的示例项目来重现该问题
应用程序在直接执行时有效,但在通过APPX启动程序执行时无效.为什么?
我正在尝试使用UWP应用程序部署示例应用程序以桥接AppServices.该示例运行并构建得很好但是当我尝试按照指南打包整个事情时它给了我一个错误.
错误信息:
Error Manifest validation error: Line 36, Column 64, Reason: The file name "BackgroundProcess.exe" declared for element "*[local-name()='Applications']/*[local-name()='Application']/*[local-name()='Extensions']/*[local-name()='Extension' and @Category='windows.fullTrustProcess']" doesn't exist in the package.
Run Code Online (Sandbox Code Playgroud)
我发现代码片段生成错误,但我还没有找到它的修复程序.
如果我从文件Package.appxmanifest中删除以下代码,Visual studio将成功构建包:
<Extensions>
<uap:Extension Category="windows.appService">
<uap:AppService Name="CommunicationService" />
</uap:Extension>
<desktop:Extension Category="windows.fullTrustProcess" Executable="BackgroundProcess.exe" />
</Extensions>
Run Code Online (Sandbox Code Playgroud)
但这显然也会消除过程中的桥接,这是本练习的重点.
这似乎与这个问题有些相关,但不同之处在于我有一个.exe,而这个问题似乎是为.dll解答的:
(更新UWP工具似乎没有解决它.)
编辑
事件日志错误是这样的:
error 0x8007000B: The app manifest publisher name (CN=...)
must match the subject name of the signing certificate
(CN={19BE29DF-4812-4F2E-8FC1-A138B146946A}).
Run Code Online (Sandbox Code Playgroud)
现在看来下面的命令似乎有效.因此,当我看到这个时,无论是我无法识别的用户错误还是与机器状态有关的东西.与事件日志消息中的签名证书关联的guid不是证书管理器管理单元中显示的证书,这很奇怪.
原始问题
我正在尝试签署使用生成的UWP appx包MakeAppx.exe.pfx是使用https://msdn.microsoft.com/windows/uwp/porting/desktop-to-uwp-manual-conversion这些命令生成的开发人员代码签名证书.
C:\> MakeCert.exe -r -h 0 -n "CN=<publisher_name>" -eku 1.3.6.1.5.5.7.3.3 -pe -sv <my.pvk> <my.cer>
C:\> pvk2pfx.exe -pvk <my.pvk> -spc <my.cer> -pfx <my.pfx>
Run Code Online (Sandbox Code Playgroud)
私钥位于我受信任的根证书存储区中,并且在我使用Desktop App Converter从安装程序生成appx时工作.
我使用的命令行是:
signtool.exe sign -f <path to my pfx file> -fd SHA256 -v .\FishTank.appx
Run Code Online (Sandbox Code Playgroud)
但是SignTool错误的是:
The following certificate was selected:
Issued to: ...
Issued by: …Run Code Online (Sandbox Code Playgroud) signtool windows-store-apps appx desktop-app-converter desktop-bridge
我有一个在VS 2008中开发的原生C++/MFC应用程序,没有.NET的东西,我使用Project Centennial转换器转换为UWP应用程序.所以现在我有一个.appx包在Windows 10 v 1607中作为UWP应用程序运行.
我的下一个目标是在提交到Windows应用商店之前添加应用内购买支持.
问题是如何从本机C或C++代码从纯Win32应用程序访问Windows.Services.Store命名空间?
是否可以在uwp和非uwp应用程序之间进行通信.我的非uwp是一个提供服务的后台任务.我想在uwp应用程序中调用非uwp服务.
怎么打电话?AppServiceConnection类是否在非uwp应用程序中可用?
win-universal-app windows-10 uwp windows-10-universal desktop-bridge
几乎所有关于新WinRT API的文章都出现了类似"WinRT是Windows的新API并取代旧的Win32 API"的陈述.由于WinRT的目标是开发Windows应用商店应用程序,因此这个声明似乎并不适用.
有许多我无法想象用WinRT完成的应用程序(例如Microsoft Office,Adobe产品,3D Designer程序甚至Visual Studio).这些应用程序仍然需要Windows API(又名Win32)的功能.
那么为什么经常说,WinRT API取代了Windows API?
我一直在尝试使用Desktop Bridge将WPF应用程序包装在Windows Universal App中.
为了使应用程序的任务栏图标没有电镀,具有透明背景,我按照可以在各种博客和MSDN文章/论坛中找到的说明进行操作,例如本文.
我执行的第一个命令是这两个:
"C:\Program Files (x86)\Windows Kits\10\bin\10.0.15063.0\x64\makepri.exe" createconfig /o /cf priconfig.xml /dq en-US
"C:\Program Files (x86)\Windows Kits\10\bin\10.0.15063.0\x64\makepri.exe" new /o /pr . /cf priconfig.xml
Run Code Online (Sandbox Code Playgroud)
这些命令在WPF应用程序的输出文件夹中执行,我还在其中放置了一个AppxManifest.xml文件,以及它引用的文件和文件夹(例如可执行文件和各种比例和分辨率的Assets图像).
从这一点来说,我有两个不同的奇怪错误:
首先,如果AppManifest.xml文件包含以下部分:
<Extensions>
<desktop2:Extension Category="windows.firewallRules">
<desktop2:FirewallRules Executable="app\MyWpfApp.exe">
<desktop2:Rule Direction="in" IPProtocol="TCP" Profile="all" />
<desktop2:Rule Direction="in" IPProtocol="UDP" Profile="all" />
</desktop2:FirewallRules>
</desktop2:Extension>
</Extensions>
Run Code Online (Sandbox Code Playgroud)
然后第二个makepri命令将导致以下错误消息:
onecoreuap\base\mrt\tools\indexertool\src\tool\parametermanager.cpp(:908):错误PRI175:0x80080204 -
onecoreuap\base\mrt\tools\indexertool\src\tool\parametermanager.cpp(:318):错误PRI175:0x80080204 -
Microsoft(R)MakePRI工具
版权所有(C)2013 Microsoft.版权所有.
错误PRI191:0x80080204 - 未找到Appx清单或无效.请确保存在格式正确的清单文件.或者使用/ in开关指定索引名称.
然后,如果我删除了FirewallRules部分,一切似乎都运行良好 - 至少在我的机器上.
其次,它并不总是按预期运行:
当我尝试在不同的机器上运行完全相同的文件(使用固定版本的AppxManifest.xml)和相同的命令时,我得到了我在第一台机器中获得的相同错误(从删除FirewallRules部分之前).
知道什么可能导致这些问题吗?构建机器之间可能存在哪些差异可能导致第二个问题?我应该寻找什么?
我曾尝试为 Windows 商店提交应用程序,但经过审核后,此通知被拒绝:
桌面桥应用程序:98 个受限功能
开发者须知
您无权使用以下受限功能:runFullTrust。请从您的申请中删除此功能并重新提交。
我打包了我的应用程序,因为它是在 Microsoft 的桌面应用程序转换器 (DAC) 教程中编写的。此外,教程还说:
对于使用桌面桥打包的桌面应用程序,您必须添加 runFullTrust 功能。
但是为什么教程说“添加 runFullTrust”然后审阅者拒绝我的提交,因为添加了 runFullTrust?我在提交中描述了为什么我需要此功能,但似乎它对决策没有影响。PS 我的应用程序是使用电子框架创建的,并使用铬引擎在我的应用程序中显示网页。
windows-store-apps windows-10 uwp desktop-app-converter desktop-bridge
我有WPF c#服务器应用程序(WCF),并希望在其中使用c ++/WinRT动态库.我可以通过使用带有WPF应用程序的UWP桌面桥和包含我的dll的UWP空应用程序来完成此操作.这适用于没有提升权限的应用程序,但WCF服务需要以管理员身份运行它.我可以通过以管理员身份启动我的应用程序或在项目清单文件中添加标签来实现此目的(requireAdministrator对于WPF和allowElevationUWP).
我的问题就在这里开始我得到的异常System.TypeLoadException与内部异常 System.Runtime.InteropServices.COMException的代码0x80040154 (REGDB_E_CLASSNOTREG))从System.StubHelpers.StubHelpers.GetWinRTFactoryObject(IntPtr pCPCMD)我办的应用程序作为管理员.
这种行为类似于我在没有桌面桥项目的情况下使用c ++/WinRT库时的行为.有这样的问题的解决方案吗?
我编译了针对Windows 10 1809(17763)版本的所有项目.
编辑:
我不关心桌面桥,但我只能找到用c ++/WinRT连接c#的方法.我想要的是使用通过MSIDL导出的类到c#应用程序.
在VS 2017中重新创建此问题的说明(要求是使用Windows 10 1809或更高版本):
1.首先,请从nuget安装C++/WinRT项目模板.
2.接下来创建Windows运行时组件(C++/WinRT)的新项目,选择目标和最低版本的Windows到1809.您应该获得单个类的项目Class.
3.现在在同一个解决方案中创建C#WPF App项目(Framework 4.7.2).在其中添加对运行时组件项目的引用,并为此引用将Copy Local设置为False.Class在WPF项目中使用(例如,在MainWindow类中创建字段RuntimeComponent1.Class c = new RuntimeComponent1.Class();)
此时,两个项目都应该是可编译的,但WPF项目将在运行时抛出异常(TypeLoadException可能是内部异常或根异常).此步骤也是我想要实现的,所有后续步骤对我来说都是多余的,但是创建工作应用程序是必需的.
4.接下来创建Windows Universal Blank App(将平台版本设置为1809),并像之前的WPF一样添加对运行时组件项目的引用,并将Copy Local设置为False.
5.之后创建Windows应用程序打包项目(目标和最低平台版本设置为1809),在其中添加UWP和WPF应用程序(应该无法添加库项目).将WPF应用程序设置为入口点.
6.此时,打包项目应该是可编译的,可以运行而不会出错.此外,应该可以从菜单启动以管理员身份运行Packaging应用程序,但它会产生运行时异常(TypeLoadException).
7.最后,默认情况下,使用提升权限运行应用程序,添加到WPF项目Application Manifest File并将requestedExecutionLevel标记更改为<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />.此外,在Package.appxmanifest内包装项目添加<rescap:Capability Name="allowElevation" />后<rescap:Capability Name="runFullTrust" />.此步骤需要以1809作为最低版本构建.
在thous steps之后,应用程序将抛出TypeLoadException(因为root或内部异常取决于如何使用Class).实际上显示它抛出的东西而不是仅仅是死亡将WPF项目类型更改为控制台,然后它会在死亡前短暂打印异常.
我正在将桌面桥用于 WPF 桌面应用程序,并希望在构建过程中自动创建 msix 包。我不想在源代码管理中存储任何版本信息。
解决方案中的 WPF 项目使用gitversion msbuild 任务在每次构建完成时自动推断可执行文件的版本。不幸的是,我不确定.appxmanifest.
我的想法是,如果能将其与构建过程完美集成(类似于 gitversion),那就太好了,但我无法找到任何有关构建或创建应用程序包过程中的选项的文档。
也许在构建过程中存在一些我不知道可以对 进行的转换步骤.appxmanifest?或者也许有一种方法可以让版本始终反映捆绑的可执行文件的版本?
(MSDN论坛问题)
msbuild wpf continuous-integration appxmanifest desktop-bridge