c# - 识别 C++/CLI 项目中有问题的依赖项

标签 c# visual-studio-2010 cmake dependencies 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.

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

这个项目以前是在别人的系统上构建和运行的,我看到它演示了好几次。该人/计算机不再可用。自上次成功构建并运行以来,一些依赖的一些路径发生了变化,我已经修复了所有与此相关的编译错误。

只是为了阐明我的项目结构:

Graph

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 包装器。当我们尝试在应用程序中加载一个包含包装器 using 语句的类时,会触发该错误。

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

我尝试使用 fuslogvw 来查找绑定(bind)错误,但在我更改设置以包含所有绑定(bind)之前它完全没有显示任何内容,然后它只显示成功绑定(bind)。 http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.100).aspx

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

我在 Dll 的编译中有一个警告(见上图): 警告 1 正在构建的项目“MSIL”的处理器架构与引用“{cli_wrapper.dll}”、“AMD64”的处理器架构不匹配。这种不匹配可能会导致运行时失败。请考虑通过配置管理器更改项目的目标处理器架构,以便使项目和引用之间的处理器架构保持一致,或者依赖于处理器架构与项目的目标处理器架构相匹配的引用。

在配置管理器中,Dll 正在为“任何 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 或服务安装特定的答案。

最佳答案

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

关于c# - 识别 C++/CLI 项目中有问题的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23373615/

相关文章:

c# - 通过 Nuke.Common/NuGet.CommandLine 部署 NuGet 包时如何通过 Azure Auth

c# - 在组框窗口窗体内使用LINQ进行复选框验证

c# - 使用 HtmlAgilityPack .NET 解析出 iframe 中的隐藏字段

windows - 构建和使用 Google Protocol Buffers

msys2 中的 Cmake 无法找到 openssl

ubuntu - boost 不包含/lib 目录吗?

c# - 为什么要升级到 c# 4.0?

c# - 什么时候清除 ViewState session ?

asp.net-mvc - Visual Studio ASP.NET MVC 项目 : setting the start URL

linux - 使cmake_check_build_system错误1