首页 > 解决方案 > 在具有提升权限的应用程序中使用 WPF 中的 C++/WinRT dll

问题描述

我有 WPF c# 服务器应用程序 (WCF) 并想在其中使用 c++/WinRT 动态库。我可以通过将 UWP 桌面桥与 WPF 应用程序和包含我的 dll 的 UWP 空应用程序一起使用来简单地做到这一点。这适用于没有提升权限但 WCF 服务需要以管理员身份运行的应用程序。我可以通过以管理员身份启动我的应用程序或在项目清单文件(requireAdministrator对于 WPF 和allowElevationUWP)中添加标签来实现这一点。

我的问题从这里开始,因为如果我以管理员身份运行应用程序,我会遇到内部异常的System.TypeLoadException异常 。System.Runtime.InteropServices.COMException0x80040154 (REGDB_E_CLASSNOTREG))System.StubHelpers.StubHelpers.GetWinRTFactoryObject(IntPtr pCPCMD)

这种行为类似于我在没有桌面桥项目的情况下使用 c++/WinRT 库时得到的行为。这种问题有什么解决办法吗?

我针对 Windows 10 1809 (17763) build 编译了所有项目。

编辑:

我不关心桌面桥,但这是我能找到将 c# 与 c++/WinRT 连接起来的唯一方法。我想要的是使用通过 MSIDL 导出到 c# 应用程序的类。

在 VS 2017 中重新创建此问题的说明(要求具有 Windows 10 1809 或更高版本):
1. 为此,首先从 nuget 安装 C++/WinRT 项目模板。
2.接下来创建Windows运行时组件(C++/WinRT)的新项目,选择目标和最低版本的windows到1809。你应该得到单类的项目Class
3. 现在在同一个解决方案中创建 C# WPF App 项目(框架 4.7.2)。在其中添加对运行时组件项目的引用并将此引用的 Copy Local 设置为 False。Class在 WPF 项目中使用(例如,在MainWindow类中创建字段RuntimeComponent1.Class c = new RuntimeComponent1.Class();
此时两个项目都应该是可编译的,但 WPF 项目将在运行时抛出异常(TypeLoadException 可能是内部异常或根异常)。这一步也是我想要实现的,所有后续步骤对我来说都是多余的,但对于创建工作应用程序是必要的。
4. 接下来创建 Windows 通用空白应用程序(将平台版本设置为 1809),并像以前一样使用 WPF 添加对运行时组件项目的引用并将 Copy Local 设置为 False。
5. 之后创建 Windows 应用程序打包项目(目标和最低平台版本设置为 1809),在其中向应用程序添加 UWP 和 WPF 应用程序(应该不可能添加库项目)。将 WPF 应用程序设置为入口点。
6. 此时打包项目应该是可编译和可运行的,没有错误。此外,应该可以从菜单启动以管理员身份运行打包应用程序,但它会产生运行时异常 (TypeLoadException)。
7. 最后使应用程序在默认情况下以提升的权限运行,添加到 WPF 项目应用程序清单文件并将requestedExecutionLevel标记更改为<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />. 同样在 Package.appxmanifest 的 Packaging 项目中添加<rescap:Capability Name="allowElevation" />after <rescap:Capability Name="runFullTrust" />。此步骤需要针对 1809 作为最低版本进行构建。

在 thous 步骤之后,应用程序将抛出 TypeLoadException(因为根异常或内部异常取决于 Class 的使用方式)。要实际显示它抛出一些东西而不是仅仅死亡,将 WPF 项目类型更改为控制台,然后它会在死亡前短暂打印异常。

标签: c#c++c++-cxdesktop-bridgec++-winrt

解决方案


推荐阅读