我的应用程序编译正常,但我收到以下运行时错误:
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中加载一个具有for Wrapper的using语句的类时,会触发该错误。
Wrapper确实有很多依赖项,但错误消息并不表示哪个依赖项存在问题。这是一个庞大而复杂的系统,其中大部分由其他团队构建。 C ++组件使用CMake来使所有依赖项都正确,但CMake本身不支持C#。
我尝试使用fuslogvw来查找绑定错误,但在我更改设置以包含所有绑定之前,它显示我绝对没有任何内容,然后它只显示成功绑定。 http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.100).aspx
路径很长,但不超过256个字符。
我在Dll的编译中有一个警告(见上图): 警告1正在构建的项目的处理器体系结构与#34; MSIL"之间存在不匹配。以及#34; {cli_wrapper.dll}"," AMD64"的处理器架构。这种不匹配可能会导致运行时故障。请考虑通过Configuration Manager更改项目的目标处理器体系结构,以便在项目和引用之间调整处理器体系结构,或者使用与项目的目标处理器体系结构相匹配的处理器体系结构依赖于引用。
在Configuration Manager中,Dll正在构建Platform"任何CPU"和Wrapper正在建造" x64"。我将dll更改为x64。我仍然遇到运行时错误。
Could not load file or assembly or one of its dependencies 执行干净,已删除的构建目录内容。没变。 重新打开Visual Studio。没变。 尝试更改要匹配的程序集名称,默认名称空间和项目名称。没有变化。
Could not load file or assembly 'xxx' or one of its dependencies. An attempt was made to load a program with an incorrect format 我相信我们必须编译为64位。我们依赖于64位C ++库。
Could not load file or assembly ... The parameter is incorrect 我是本地管理员。
How to enable assembly bind failure logging (Fusion) in .NET 尝试了注册表设置,但它们似乎只是fuslogvw设置。可用日志数据没有改善。
许多其他类似问题都有ASP或服务安装特定答案。
答案 0 :(得分:6)
我发现了问题。我可以使用多个版本的库,我使用的是一个版本的包含文件和另一个版本的编译库。 Dependancy Walker是找到哪个图书馆存在问题的关键,如果Aschratt发布了这个作为答案而不是评论,我会接受他的回答。
答案 1 :(得分:3)
本周早些时候我在类似项目中遇到了同样的错误。首先,使用C ++ / CLI时,“Any CPU”不存在。我必须为x86构建两者才能完成任务。
此外,虽然我的包装器的依赖项得到了满足,但它是CLR捕获的包装器异常,所以它声称包装器缺少依赖项。我实际上错过了我的包装器包装的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。他详细介绍了我提出的前两条建议以及其他建议。
祝你好运!答案 2 :(得分:0)
我稍后会遇到的另一个根本原因是,我正在处理的应用程序使用了模拟,并且模拟的用户没有访问GAC或某些dll所在的文件夹的权限。您需要授予该用户权限,或更改模拟方式以在模拟开始之前加载依赖项。