无法加载文件或程序集,系统找不到指定的文件。

23

我正在构建一个dll,它引用了第二个dll。通过在第一个dll的项目中转到 属性>常规属性>框架和引用>添加新引用>浏览,我已将第二个dll作为参考添加到第一个dll中。

我从第三方源代码编译了第二个dll。两个项目均为C++/CLI。 每当我的主应用程序尝试调用第一个dll中包含对第二个dll的调用的函数时,我会得到以下错误:

发生类型为“System.IO.FileNotFoundException”的未处理异常   出现在未知模块中。

     

其他信息:无法加载文件或程序集“NBIS,   Version=1.0.5156.29834, Culture=neutral, PublicKeyToken=null”或其中之一   其依赖项。系统找不到指定的文件。

我将第二个dll的副本放在与主exe相同的目录中,甚至尝试将其与第一个dll保持在同一目录下,但都没有成功。

第二个dll引用了几个静态库,但它所包含的程序集引用仅有:

System

System.Data

System.Drawing

System.XML

我已在第一个dll中添加了所有这些程序集引用。

我该怎么做才能使我的应用程序找到并加载第二个dll?


3
或其依赖项之一 - Hans Passant
@HansPassant 既然引用的唯一动态库是我列出的那些,这不就表明它不是由于依赖关系引起的吗? - duggulous
这假设你知道 nbis.dll 的依赖关系。但你并不知道,只有供应商或作者知道。 - Hans Passant
@HansPassant,我从作者的源代码编译了nbis.dll。在nbis项目属性中列出的程序集包括:System、System.Data、System.Drawing和System.XML。所有其他依赖项都是静态库。还有其他可能隐藏依赖项的地方吗? - duggulous
3
使用SysInternals的Process Monitor。你会看到你的程序在搜索DLL并且找不到它。 - Hans Passant
显示剩余3条评论
5个回答

37

如评论中所指出,SysInternals的Process Monitor是诊断DLL解析问题的有用工具。它可以告诉您第三方DLL是否有您不知道的依赖关系,还可以告诉您Windows在硬盘的错误位置查找文件或找到错误的文件。

Loader snaps是Windows的内置诊断工具。但Process Monitor更加方便。

它生成了相当多的信息,从跟踪的底部开始或在正确的时间启用跟踪。通常需要使用过滤工具将其转换为相关的少量信息。值得花一个小时的时间来弄清楚,这个工具应该在任何程序员的工具箱里。


5
右键单击创建dll的项目和新引用项目,然后选择属性。 在应用程序下,检查目标框架并验证两者是否具有相同的框架,一些dll项目 tend to by 默认选择“客户端配置文件”版本的框架,这可能会导致您现在遇到的错误。 如果这不是问题,请告诉我。

2
这两个项目都瞄准了.NET v4.5,你可以在这些图片中看到: dll1 dll2 - duggulous

3

我的PowerShell ISE没有以管理员身份运行。这对我来说似乎是问题所在。


0

请更改您的应用程序池设置。
保留以下步骤:

  1. 打开IIS管理器
  2. 点击“应用程序池”(应用程序池列表)
  3. 选择您的应用程序池
  4. 右键单击您的应用程序池,选择“高级设置”
  5. 将“启用32位应用程序”从false更改为true。(创建应用程序池时,默认分配为false)

0

针对警告错误(“系统找不到指定的文件。”)

  1. 右键单击[解决方案程序名称],然后选择“生成依赖项”>并单击“生成自定义...”,然后选中复选框{MASM},最后单击“确定”按钮。

  2. 右键单击[解决方案程序名称],然后单击“属性”,在“链接器”中选择“调试”,在“调试”中选择“调试汇编”,将“调试汇编”的值转换为“Yes (/ASSEMBLYDEBUG)”,在“系统”中选择“子系统”,将“子系统”的值转换为“Windows (/SUBSYSTEM:WINDOWS)”,最后单击“确定”按钮。

  3. 右键单击[解决方案程序名称],然后选择“添加”>“新项目”,选择“C++文件(.cpp)”,更改名称或将“新项目”重命名为“Main.asm”,然后单击“添加”按钮,右键单击[Main.asm],然后选择“属性”,从“常规”中选择“项目类型”,将“项目类型”的值转换为“Microsoft宏汇编器”,最后单击“确定”按钮,然后在“Main.asm”文件中编写汇编代码,使用顶部屏幕程序上的“调试”工具栏中的“步过 === F10”进行调试,这就是如何在“Visual Studio 2017”中使用汇编代码的全部内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接