我有一个F#.NET解决方案,在VS 2013中有一个项目,其中包含一些托管C#.NET和非托管C++DLL引用。
此解决方案在32位Windows 7 Enterprise下的FSI中完美运行。然而,如果我将解决方案中的所有复制到具有64位Windows 8.1操作系统的计算机上,保持引用DLL、文件等的所有相对和绝对路径相同,FSI会给我
System.DllNotFoundException: Unable to load DLL 'dllName': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
名为dllName
的非托管C++DLL的错误,该DLL是解决方案的一部分,已被复制、存在并被引用。
dllName
在\x64和\x86文件夹下有32位和64位版本。它们都被引用、复制并存在。32位操作系统和64位操作系统上的项目属性相同。我还在64位操作系统下尝试了属性->调试的配置和平台设置以及属性->构建的配置、平台和平台目标设置的所有可能组合,但都没有成功。
我想不知何故,FSI,在64位操作系统中的任务管理器->进程中显示为Fsi.exe (32-bit)
,而在32位操作系统的Fsi.exe
,是在64位环境中弄乱我的32位应用程序的罪魁祸首,而我没有接触解决方案的任何部分。
我认识的聚会迟到了,但为了未来的搜索者:
当我的F#应用程序从共享动态加载混合模式的C++/CLI dll(具有非托管dll依赖项)时,我遇到了这个问题。
它在非交互式中运行良好,但在交互式中加载DLL失败。
对我来说,问题是卷影复制,它不适用于DLL的非托管依赖项。
解决方案是关闭F#交互式卷影复制。设置在Tools->Options->F# tools->Shadow copy assemblies
下。如果我将其设置为false
,则一切正常。