相关疑难解决方法(0)

除非我引用项目,否则无法加载WinRT组件

我遇到了一个奇怪的问题.我创建了一个Windows运行时组件(用于Windows应用商店),它通过一些C#包装器类为.NET提供了一些旧的C/C++代码.

我编写了一个测试工具Store App(以下简称"test1"),它引用了WRC 项目(两个项目都在同一个解决方案中).它调用组件,一切正常.

接下来,我从WRC项目中获取以下输出文件:

MyWrtComponent.dll
MyWrtComponent.exp
MyWrtComponent.pdb
MyWrtComponent.pri
MyWrtComponent.winmd
Run Code Online (Sandbox Code Playgroud)

...并尝试从其他商店应用项目("test2")使用它们.在这个项目中,我添加了对.winmd文件的引用,而不是引用MyWrtComponent项目.一切都很好,但是当我运行test2应用程序时,只要我尝试使用MyWrtComponent中实现的一个C#类,我就会从mscorlib获得一个System.IO.FileNotFound异常:

at System.StubHelpers.StubHelpers.GetWinRTFactoryObject(IntPtr pCPCMD)
at MyWrtComponent.MyWrtClass..ctor()

The specified module could not be found.
(Exception from HRESULT: 0x8007007E)
Run Code Online (Sandbox Code Playgroud)

使用MyWrtComponent的release vs. debug构建没有任何区别.

在test2上运行ProcMon,我看到几次尝试加载vccorlib120_app.DLL(或者如果我正在构建调试时为vccorlib120d_app.DLL)的尝试失败:

QueryOpen   F:\test2\bin\Debug\AppX\vccorlib120d_app.DLL    NAME NOT FOUND
QueryOpen   F:\test2\bin\Debug\AppX\vccorlib120d_app.DLL    NAME NOT FOUND
CreateFile  C:\Windows\SysWOW64\vccorlib120d_app.DLL    NAME NOT FOUND
Run Code Online (Sandbox Code Playgroud)

我已经确认我的C:\ Windows\SysWOW64文件夹中不存在此文件.我不知道这是否与我的问题有关.

当我运行test1时,搜索不同的位置,找到该文件:

QueryOpen   F:\test1\bin\Debug\AppX\vccorlib120d_app.DLL    NAME NOT FOUND
CreateFile  C:\Program Files\WindowsApps\Microsoft.VCLibs.120.00.Debug_12.0.20827.3_x86__8wekyb3d8bbwe\vccorlib120d_app.dll SUCCESS
Run Code Online (Sandbox Code Playgroud)

我比较了两个测试项目的bin\Debug\AppxManifest.xml,并注意到一个重要的区别; test1有以下内容,test2没有:

<Dependencies>
  <PackageDependency Name="Microsoft.VCLibs.120.00.Debug" MinVersion="12.0.20827.3" />
</Dependencies>
Run Code Online (Sandbox Code Playgroud)

如果我将这三行添加到test2的生成输出并运行应用程序,它可以工作,但当然这不是一个真正的修复.

有谁知道这里发生了什么?MyWrtComponent是否具有以某种方式未被通信的依赖关系,或者我应该做什么来将vccorlib120d_app.DLL与我的运行时组件一起打包,或者......?

提前致谢.

c# visual-c++ windows-runtime windows-store-apps windows-8.1

6
推荐指数
1
解决办法
5795
查看次数