我遇到了一个奇怪的问题。我创建了一个 Windows 运行时组件(用于 Windows 应用商店),它通过一些 C# 包装器类使一些遗留 C/C++ 代码可用于 .NET。
我编写了一个引用 WRC 项目(同一解决方案中的两个项目)的测试工具商店应用程序(以下称为“test1”)。它调用组件,一切正常。
接下来我从 WRC 项目中获取以下输出文件:
MyWrtComponent.dll
MyWrtComponent.exp
MyWrtComponent.pdb
MyWrtComponent.pri
MyWrtComponent.winmd
...并尝试从另一个应用商店应用项目(“test2”)使用它们。在此项目中,我没有引用 MyWrtComponent 项目,而是添加了对 .winmd 文件的引用。一切都很好,但是当我运行 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)
使用 MyWrtComponent 的发布版本与调试版本没有任何区别。
在 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
我已确认此文件不存在于我的 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
我比较了两个测试项目的 bin\Debug\AppxManifest.xml,发现了一个重要的区别; test1 具有以下内容而 test2 没有:
<Dependencies>
<PackageDependency Name="Microsoft.VCLibs.120.00.Debug" MinVersion="12.0.20827.3" />
</Dependencies>
如果我将这三行添加到 test2 的生成输出并运行该应用程序,它就可以工作,但这当然不是真正的修复。
有人知道这里发生了什么吗? MyWrtComponent 是否具有以某种方式未被传达的依赖关系,或者我是否应该做一些事情来将 vccorlib120d_app.DLL 与我的运行时组件一起打包,或者......?
提前致谢。
最佳答案
好吧,你在这里遇到了几个问题,第一个是因为你的 WinRT 组件使用 C++,你需要在你的应用程序中引用 Microsoft Visual C++ 运行时包,这是预期的由组件的最终用户(应用程序开发人员)执行,因此,右键单击应用程序解决方案资源管理器中的引用文件夹并转到 Windows-> 扩展,从列表中选择 Microsoft Visual C++ Runtime Package可用的 SDK,然后单击“确定”。
其次,如果您打算自己保留此组件,最好引用该项目,因为这样做更容易,如果您打算分发它,则需要创建一个 SDK 以确保所有各个部分放在一起,请注意,这对于 C++ WinRT 组件是必需的,但对于 C# 或 VB.NET 组件则不是,原因似乎是 C++ WinRT 组件被拆分为元数据(WinMD 文件)和实现(DLL 文件),甚至如果将它们并排放置,它们将无法相互识别,而在 C# 和 VB.NET 中,元数据及其实现位于同一文件 (WinMD) 中。如果您想创建一个 SDK,请阅读 this documentation在 MSDN 上。
关于c# - 除非我引用该项目,否则无法加载 WinRT 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19555318/