我遇到了一个奇怪的问题.我创建了一个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