在C ++ / CLI项目中识别有问题的依赖项

我的应用程序编译正常,但我得到以下运行时错误:

System.IO.FileNotFoundException was unhandled HResult=-2147024770 Message=Could not load file or assembly {Wrapper} or one of its dependencies. The specified module could not be found. 

调用Application中对Wrapper的引用看起来是正确的。 Wrapper dll存在于正确的位置。

这个项目用于在别人的系统上构建和运行,我看了几次。 该人/计算机不再可用。 自上次成功构建和运行以来,某些依赖项的某些路径已发生更改,我已修复了与此相关的所有编译错误。

只是为了澄清我的项目结构:

图形

 Digraph G { App [ label = "My C# Application"] Wrapper [ label = "C++/CLI Wrapper"] Lib [ label = "C++ Library"] Dll [ label = "My helper C# DLL"] CDep [ label = "Series of deep C++ dependencies managed \n by CMake for Lib, hard coded relative paths for Wrapper."] App->Wrapper->Lib->CDep; App->Dll->Wrapper->CDep; } 

Wrapper是围绕C ++库的C ++ / CLI包装器。 当我们尝试在Application中加载具有Wrapper的using语句的类时,会触发该错误。

Wrapper确实有很多依赖项,但错误消息并不表示哪个依赖项存在问题。 这是一个庞大而复杂的系统,其中大部分由其他团队构建。 C ++组件使用CMake来使所有依赖项都正确,但CMake本身不支持C#。

我尝试使用fuslogvw来查找绑定错误,但它直到我更改了包含所有绑定的设置,然后它才显示成功绑定时,它绝对没有显示任何内容。 http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.100).aspx

路径很长,但不超过256个字符。

我在Dll的编译中发出警告(见上图):警告1正在构建的项目的处理器体系结构“MSIL”与参考“{cli_wrapper.dll}”,“AMD64”的处理器体系结构不匹配”。 这种不匹配可能会导致运行时故障。 请考虑通过Configuration Manager更改项目的目标处理器体系结构,以便在项目和引用之间调整处理器体系结构,或者使用与项目的目标处理器体系结构相匹配的处理器体系结构依赖于引用。

在Configuration Manager中,Dll正在构建Platform“Any CPU”,而Wrapper正在为“x64”构建。 我将dll更改为x64。 我仍然得到运行时错误。

无法加载文件或程序集或其依赖项之一执行干净,已删除的构建目录内容。 没变。 重新打开Visual Studio。 没变。 尝试更改要匹配的程序集名称,默认名称空间和项目名称。 没变。

无法加载文件或程序集“xxx”或其依赖项之一。 尝试加载一个格式不正确的程序,我相信我们必须编译为64位。 我们依赖于64位C ++库。

无法加载文件或程序集…参数不正确我是本地管理员。

如何在.NET中启用程序集绑定失败日志记录(Fusion)尝试了注册表设置,但它们似乎只是fuslogvw设置。 可用日志数据没有改善。

许多其他类似问题有ASP或服务安装特定答案。

我发现了问题。 我可以使用多个版本的库,我使用的是一个版本的包含文件和另一个版本的编译库。 Dependancy Walker是找到哪个图书馆有问题的关键,如果Aschratt发布了这个作为答案而不是作为评论,我会接受他的回答。

本周早些时候,我在类似的项目中遇到了同样的错误。 首先,使用C ++ / CLI时,“Any CPU”不存在。 我不得不为x86构建两者来完成任务。

此外,虽然我的包装器的依赖项得到满足,但它是CLR捕获的包装器exception,因此声称包装器缺少依赖项。 我实际上错过了我的包装器包装的C ++ DLL的依赖项(在我的情况下,这只是忘记在我的新“Release”配置输出文件夹中丢弃SDL2.dll和OpenAL32.dll的问题…我以前仅适用于我已经删除了这些DLL的Debug配置。

如果你肯定你已经解决了你的包装器的依赖关系,我建议使用Dependency Walker来检查本机DLL的依赖关系。 您可以将Assembly.GetReferencedAssemblies与外部脚本/程序一起使用来仔细检查您的包装器(或ILSpy: http ://ilspy.net/)。

最后但同样重要的是,请看一下: http : //www.codeproject.com/Articles/442784/Best-gotchas-of-Cplusplus-CLI 。 他详细介绍了我提出的前两条建议以及其他一些建议。

祝好运!

我之前遇到的另一个根本原因是,我正在使用的应用程序使用模拟,而模拟用户没有GAC或某些dll所在文件夹的权限。您需要要么为该用户授予权限,要么在模拟开始之前更改模拟加载依赖项的方式。