我System.IO.FileNotFoundException: The specified module could not be found
在运行调用 C++/CLI 程序集的 C# 代码时得到,该程序集又调用纯 C DLL。只要实例化调用纯 C DLL 函数的对象,就会发生这种情况。
BackingStore 是纯 C。CPPDemoViewModel 是调用 BackingStore 的 C++/CLI,它具有对 BackingStore 的引用。
我尝试了最简单的情况——添加一个新的 C# 单元测试项目,它只是试图创建一个在 CPPDemoViewModel 中定义的对象。我从 C# 项目中添加了对 CPPDemoViewModel 的引用。
只需添加对 CPPDemoViewModel 的引用,C++/CLI 测试项目就可以正常工作,因此它是在语言之间进行切换。
我正在使用带有 .Net 3.5 SP1 的 Visual Studio 2008 SP1。我在 Vista x64 上构建,但一直小心确保我的平台目标设置为 x86。
这感觉就像我错过了一些愚蠢和明显的事情,但浪费时间试图私下解决它会更愚蠢,所以我在这里让自己尴尬!
这是对移植大量遗留 C 代码的项目的测试,我将这些代码保存在 DLL 中,并使用 C++/CLI 实现的 ViewModel。
编辑 检查目录后,我可以确认没有复制BackingStore.dll。
我有使用典型的多项目解决方案创建的标准唯一项目文件夹。
WPFViewModelInCPP 后台存储 CPPViewModel CPPViewModelTestInCS 斌 调试 调试
令我惊讶的是,更高级别的 Debug 似乎是 C 和 C++/CLI 项目使用的公共文件夹。
WPFViewModelInCPP\Debug 包含 BackingStore.dll、CPPDemoViewModel.dll、CPPViewModelTest.dll 及其关联的 .ilk 和 .pdb 文件
WPFViewModelInCPP\CPPViewModelTestInCS\bin\Debug 包含 CPPDemoViewModel 和 CPPViewModelTestInCS .dll 和 .pdb 文件,但不包含 BackingStore。但是,手动将 BackingStore 复制到该目录并不能修复该错误。
CPPDemoViewModel 具有属性Copy Local set,我假设它负责在引用 if 时复制其 DLL。我无法将 C# 项目的引用添加到纯 C DLL - 它只是说无法添加对备份存储的引用。
我不确定我是否只有一两个问题。
我可以使用老式的复制构建步骤将 BackingStore.dll 复制到任何给定的 C# 项目的目录中,尽管我希望新的 .net 模型不需要这样做。
DependencyWalker 告诉我丢失的文件是 GPSVC.dll,这表明存在安全设置问题。我怀疑这是一个红鲱鱼。
edit2 将BackingStore.dll 的手动副本与可执行文件相邻,GUI 现在可以正常工作。C# 测试项目仍然存在问题,我怀疑这是由于测试项目的运行时环境造成的,但我现在可以不用它。