我正在System.IO.FileNotFoundException: The specified module could not be found
运行调用C++/CLI程序集的C#代码,后者又调用纯C DLL.只要实例化一个调用纯C DLL函数的对象,就会发生这种情况.
BackingStore是纯C.CPPDemoViewModel是C++/CLI调用BackingStore它有一个对BackingStore的引用.
我尝试了最简单的案例 - 添加一个新的C#单元测试项目,它只是试图创建一个在CPPDemoViewModel中定义的对象.我从C#项目添加了一个引用到CPPDemoViewModel.
只需添加对CPPDemoViewModel的引用,C++/CLI测试项目就可以正常运行,因此它可以在语言之间进行.
我正在使用Visual Studio 2008 SP1和.Net 3.5 SP1.我正在构建Vista x64,但一直小心确保我的平台目标设置为x86.
这感觉就像一些愚蠢而且显而易见的我不知道但是浪费时间试图私下解决它会让我更加愚蠢所以我在这里让自己感到尴尬!
这是对一个移植大量遗留C代码的项目的测试,我将其保存在一个带有在C++/CLI中实现的ViewModel的DLL中.
编辑 检查目录后,我可以确认尚未复制BackingStore.dll.
我拥有使用典型的多项目解决方案创建的标准唯一项目文件夹.
WPFViewModelInCPP BackingStore CPPViewModel CPPViewModelTestInCS bin Debug Debug
令我惊讶的是,更高级别的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#测试项目仍有问题,我怀疑是由于测试项目的运行时环境,但我现在可以没有它.
C和C++ DLL是否与正在执行的C#程序集位于同一目录中?
您可能必须更改项目输出设置,以便C#程序集和其他DLL都最终位于同一文件夹中.
在这样的情况下,我经常使用Dependency Walker ; 这是一个完整性检查,显示实际上可以找到所有依赖项.
应用程序运行后,您可能还想在正在运行的代码上试用Process Monitor,以查看正在引用的DLL以及它们的位置.