WP8.1发布版本异常的原因:" System.IO.FileNotFoundException:找不到指定的模块"?

时间:2015-02-05 20:20:25

标签: c++ windows-phone-8

我发布了一个在开发Windows Phone 8.1发布模式应用时遇到的问题。幸运的是,我能够解决问题,我想通过StackOverflow分享。

遇到的问题如下:

  • 我有一个Windows Phone 8.1(WP8.1)应用程序,它有一个Windows运行时组件。
  • 在调试模式下编译时,应用程序运行正常。
  • 当我在发布模式下构建它时,应用程序链接并运行。但是,当C#部分尝试实例化Windows运行时组件类时,应用程序会抛出一个System.IO.FileNotFoundException异常,该异常由App.xaml.cs中的Application_UnhandledException()捕获:
System.IO.FileNotFoundException: The specified module could not be found. (Exception from HRESULT: 0x8007007E)
at System.StubHelpers.StubHelpers.GetWinRTFactoryObject(IntPtr pCPCMD)
. . .

我尝试调试发布版本,禁用项目中的所有优化,但结果并不确定。我放在本机代码构造函数上的断点从未被调试器击中(我将调试切换到" Native Only"在Properties> Debug中)。

查看编译器和链接器设置并未显示任何异常情况。问题的原因是什么?

1 个答案:

答案 0 :(得分:0)

抛出System.IO.FileNotFoundException的原因是因为要在发布模式下链接的库列表(链接器>输入>附加依赖项)包括SQLite3D.lib(SQLite库的调试版本)而不是SQLite。 lib(发布版本):

  

API.lib; Internals.lib; JSON.lib; sqlite3D.lib;%(AdditionalDependencies)

这足以阻止Windows Phone 8.1加载Windows运行时组件DLL以调用类构造函数。

解决方案是链接发布库而不是调试库:

  

API.lib; Internals.lib; JSON.lib; sqlite3.lib;%(AdditionalDependencies)

这解释了为什么应用程序在调试模式下完美运行。

我在C / C ++方面的经验告诉我,混合调试和发布库可能会有问题。一个例子是在发布模式DLL中分配内存并在调试模式DLL中释放内存,因为这里有两个不同的内存管理系统。手头的案例阐明了不混合发布和调试DLL /库的另一个原因。