Log*_*man 7 c# c++ c++-cx c++-winrt 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项目类型更改为控制台,然后它会在死亡前短暂打印异常.