c# - 在具有提升权限的应用程序中使用 WPF 中的 C++/WinRT dll
问题描述
我有 WPF c# 服务器应用程序 (WCF) 并想在其中使用 c++/WinRT 动态库。我可以通过将 UWP 桌面桥与 WPF 应用程序和包含我的 dll 的 UWP 空应用程序一起使用来简单地做到这一点。这适用于没有提升权限但 WCF 服务需要以管理员身份运行的应用程序。我可以通过以管理员身份启动我的应用程序或在项目清单文件(requireAdministrator
对于 WPF 和allowElevation
UWP)中添加标签来实现这一点。
我的问题从这里开始,因为如果我以管理员身份运行应用程序,我会遇到内部异常的System.TypeLoadException
异常 。System.Runtime.InteropServices.COMException
0x80040154 (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 项目类型更改为控制台,然后它会在死亡前短暂打印异常。
解决方案
推荐阅读
- javascript - 为什么我得到参考错误,我的代码有什么问题?
- python - {foo:>7f} 在 Python f 字符串中做了什么?
- css - 如何使 CSS 绘图始终在每个屏幕中固定显示?
- flutter - 无法为模拟器构建应用程序。在 iPhone 12 Pro Max 上启动应用程序时出错
- c# - 如何将控制器添加到 blazor wasm 以生成我的数据库的统计信息?
- google-workspace - 查看 Google Workspace Sites for Business 所需的自定义身份验证
- python-3.x - 我编写了一个简单的程序来自动化斐波那契数列,但它不起作用,我不知道为什么
- ios - CloudKit 记录 ID 不是唯一的
- javascript - Webpack - 如何使用异步功能导入脚本
- azure-pipelines - Devops 中的 AdvancedInstaller - 无法同步文件