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

时间:2014-02-13 00:14:59

标签: .net visual-studio-2012 dll c++-cli

我正在构建一个dll,它引用了第二个dll。我在第一个dll的项目中添加了第二个dll作为参考,转到Properties > Common Properties > Framework and References > Add New Reference > Browse

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

  

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

     

其他信息:无法加载文件或程序集'NBIS,   Version = 1.0.5156.29834,Culture = neutral,PublicKeyToken = null'或者one   它的依赖关系。系统找不到指定的文件。

我有一个与我的主exe在同一目录中的第二个dll的副本,我甚至尝试在第一个dll旁边保留一个副本,但无济于事。

第二个dll引用了几个静态库,但它包含的唯一程序集引用是

  

系统

     

System.Data

     

System.Drawing中

     

了System.XML

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

如何让我的应用程序找到并加载第二个dll?

5 个答案:

答案 0 :(得分:23)

正如评论中所指出的,SysInternals'Process Monitor是诊断DLL解析问题的有用工具。当第三方DLL具有您不知道的依赖关系时告诉您,还告诉您Windows何时查找硬盘驱动器的错误角落或找到错误的文件。

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

它确实会生成相当多的信息,从跟踪的底部开始或在恰当的时间启用跟踪。您经常需要使用其过滤工具将firehose转换为相关的涓流。值得花时间去弄清楚,这个工具属于任何程序员的黑带。

答案 1 :(得分:4)

右键单击您创建dll和新引用项目的项目,然后选择属性。 在Application下,检查目标框架并验证两者是否具有相同的框架,默认情况下,某些dll项目倾向于选择框架的“客户端配置文件”版本,这往往会给出您现在遇到的错误。

如果这不是问题,请告诉我。

答案 2 :(得分:2)

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

答案 3 :(得分:0)

请更改您的应用程序池设置 保持步骤:

  1. IIS管理器打开
  2. 点击“应用程序池”' (应用程序池列表)
  3. 选择您的应用程序池
  4. 右键单击您的应用程序池,然后选择“高级设置'
  5. 更改'启用32位应用程序'从虚假到真实。 (创建应用程序池时启用32位应用程序默认值为false)

答案 4 :(得分:0)

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

  1. 右键单击[解决方案程序名称],然后选择Build Dependencies>,然后左键单击Build Customizations ...,然后选中{MASM},然后单击OK按钮。

  2. 右键单击[解决方案名称],然后单击“属性”,在“链接器”窗体上单击鼠标左键,在“链接器”中选择“调试”,在“调试”中单击“调试”,然后从“调试”中选择“调试程序集”将“调试程序集”的值转换为“是(/ ASSEMBLYDEBUG)”,形成“链接器”,选择“系统”,在“系统”上单击“系统”,然后从“系统”中选择“子系统”,并将“子系统”的值转换为“ Windows” (/ SUBSYSTEM:WINDOWS)”,左键单击“确定”按钮。

  3. 右键单击[解决方案名称],然后添加>新项目,“ C ++ File(.cpp)”更改名称或将“新项目”重命名为“ Main.asm”,然后单击“添加”按钮,右键单击[Main.asm],然后单击“属性”,从“常规”中选择“常规”,再选择“项目类型”,并将“项目类型”的值转换为“ Microsoft宏汇编程序”,然后单击确定按钮,然后单击“确定”。然后将您的汇编代码写入“ Main.asm”文件中,然后使用[[[[Debug]]]使用顶层屏幕程序“调试”工具栏中的“跳过=== F10”将其进行编码,所有有关如何使用汇编的信息“ Visual Studio 2017”中的代码。