运行C#代码(调用C++/CLI程序集,依次调用纯C DLL)时,我得到了System.IO.FileNotFoundException: The specified module could not be found
。一旦实例化调用纯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上构建,但是要确保将我的Platform目标设置为x86。
这感觉像是愚蠢而明显的我想念的东西,但是我浪费时间试图私下解决它会更愚蠢,所以我在这里使自己感到尴尬!
这是对移植大量遗留C代码的项目的测试,我使用C++/CLI实现的ViewModel将其保留在DLL中。
编辑
检查目录之后,我可以确认尚未复制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具有“复制本地集”属性,我假设该属性负责在引用if时复制其DLL。我无法将C#项目中的引用添加到纯C DLL中-只是说无法添加对后备存储的引用。
我不确定是否只有一两个问题。
我可以使用老式的复制构建步骤将BackingStore.dll复制到任何给定的C#项目的目录中,尽管我希望新的.net模型不需要这样做。
DependencyWalker告诉我丢失的文件是GPSVC.dll,它的has been suggested指示安全设置问题。我怀疑这是一条红鲱鱼。
编辑2
通过将BackingStore.dll的手动副本与可执行文件相邻,GUI现在可以正常工作。我怀疑C#测试项目仍然存在问题,这是由于测试项目的运行时环境所致,但现在我可以不用它了。
最佳答案
C和C++ DLL与正在执行的C#程序集位于同一目录中吗?
您可能必须更改项目输出设置,以使C#程序集和其他DLL都位于同一文件夹中。
在这种情况下,我经常使用Dependency Walker。这是一项健全性检查,表明实际上可以找到所有依赖项。
一旦您的应用程序运行,您可能还需要在运行的代码上尝试Process Monitor,以查看正在引用的DLL以及它们的位置。
关于从C#到C++/CLI到C DLL System.IO.FileNotFoundException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/647310/