无法加载文件或程序集“AForge.Video.FFMPEG.dll”或其某个依赖项。

5

我正在使用Visual Studio Community 2015开发一个.NET应用程序,其中使用了一些AForge.NET库。我已经将这些库添加到我的项目中,在调试应用程序时,这些库工作正常。但是,当我发布并在同一台计算机上安装该应用程序后,一旦到达使用AForge.NET库的应用程序部分,应用程序就会崩溃,并显示以下错误:

System.IO.FileNotFoundException: Could not load file or assembly 'AForge.Video.FFMPEG.dll' or one of its dependencies. The specified module could not be found.
Filename: 'AForge.Video.FFMPEG.dll'
    on MyApp.mySecondForm..ctor(Int32 id)
    on MyApp.myMainForm.myListView_DoubleClick(Object sender, EventArgs e)
    on System.Windows.Forms.Control.OnDoubleClick(EventArgs e)
    on System.Windows.Forms.ListView.WndProc(Message& m)
    on System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    on System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    on System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

我在网上搜索了解决方法,但是到目前为止以下任何一种方法都没有奏效:

  • 安装Visual Studio C++ Redistributable(认为可能是缺少依赖项)
  • 使用文件系统编辑器在安装时添加库(我找不到Visual Studio中的编辑器)。

此外,我搜索了应用程序安装的文件夹,看到所有DLL文件都在那里,每个文件都在不同的文件夹中,还有一个包含所有DLL和其他文件的文件夹。

我对其他库(全局程序集缓存中的库)没有任何问题,例如MySql.Data

根据Chris O的建议,我使用进程监视器检查我的应用程序,它显示正在GAC中查找AForge库;由于我没有将它们添加到那里,因此无法找到它们。

我需要做什么才能配置我的应用程序,以便它可以从应用程序文件夹访问库而不是在GAC中查找它们?


1
当你在调试时,模块窗口会显示加载了哪些DLL,也许其中一些在部署中缺失。然而,如果AForge还需要一些配置文件,则该技术无法帮助。您可以尝试观察文件系统,使用Process Monitor,只启用文件系统活动,为您的应用程序添加一些过滤器(以减少噪音),然后查找在错误发生时找不到的文件。 - Chris O
@ChrisO 谢谢!我刚刚这样做了,它显示我的应用程序正在GAC中查找AForge.NET库。所以我想我需要找到一种方法,要么将库添加到GAC中,要么使其在其他地方查找库。 - Rodrigo Salgado Atala
3个回答

8

外部库必须复制到包含AForge.Video库的安装文件夹中。

AForge.Video库包含一些无法作为引用添加的外部DLL文件。相反,它们必须复制到项目的bin文件夹中。同样,在安装应用程序后,它们必须复制到其他DLL文件所在的文件夹中。文件夹的确切名称因情况而异,但在我的情况下,我必须将它们复制到以下目录:

C:\Users\用户名\AppData\Local\Apps\2.0\3V9YACJD.EPJ\V4BGBR0L.485\appe..tion_0000000000000000_0001.0008_b483b48e9712fa89

需要复制的DLL文件如下:

  • avcodec-53.dll
  • avdevice-53.dll
  • avfilter-2.dll
  • avformat-53.dll
  • avutil-51.dll
  • postproc-52.dll
  • swresample-0.dll
  • swscale-2.dll

我是在创建一个新的Visual Studio项目时注意到这一点的,并忘记在新项目中复制外部库,这导致了开发中的同样错误(此前我没有遇到过)。


对于其他像我一样的人,可能会认为具有类似名称但不同版本(例如avcode-59.dll、avdevice-59.dll)的dll文件也可以正常工作:事实并非如此!请使用此处列出的完全相同的文件。 - dtwk2
这里是自动将dll文件包含在bin文件夹中的解决方案:https://dev59.com/dWMl5IYBdhLWcg3wCDKW - dtwk2

2

在启动之后,在app.config上添加useLegacyV2RuntimeActivationPolicy="true"

例如:

`<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true"> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
</configuration>`

将AForge外部dll复制到Externals\ffmpeg\bin中,然后将其复制到项目bin\debug文件夹中。"最初的回答"

1

尝试在x86平台上构建您的项目。


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