当一个Windows窗体应用程序可以使用AForge.Video.FFMPEG时,ASP.NET应用程序无法加载它

5
我遇到了以下错误:
ASP.NET运行时错误:无法加载文件或程序集“ AForge.Video.FFMPEG.DLL”或其某个依赖项。指定的模块无法找到。
我在Windows Forms项目中使用过它,但在尝试将该项目转换为ASP.NET项目后,我一直无法让它运行。我之前使用了64位DLL,但现在已切换到32位DLL,因为我似乎更容易通过这种方式获得进展(使用64位DLL时出现类似的错误)。
我已经将项目属性中的平台目标设置为x86,并尝试将其设置为任何CPU(因为DLL是本地32位的,所以会触发警告),还尝试过在使用64位DLL的情况下将目标更改为x64。
在IIS应用程序池中,我的“启用32位应用程序”设置为true。当我移除此DLL时,该项目可以正常运行,而添加回来则导致它失败。
我尝试过:
1. 将DLL放到System32中。 2. 将bin文件夹(其中包含DLLs)放在PATH中。 3. 将应用程序目标设置为所有可能的选择(x86、x64、任意CPU)。 4. 验证此DLL未损坏,甚至尝试了由不同源编译的DLL。 5. 所有FFMPEG DLL都在bin文件夹中;还尝试将它们放在System32中。
在此项目中,没有代码使用DLL(我有一个Windows Forms项目的代码要合并到这个项目中,但如果引用甚至无法工作,我就无法这样做)。 我甚至创建了新项目,以防该项目中存在某些怪异的物品。
请注意,我已经阅读了与此DLL和ASP.NET相关的几乎所有Google结果。没有任何方法可行。

值得一提的是,我基本上只使用了VS 2013生成的默认ASP.NET Web Forms应用程序,然后删除了所有不需要的内容,并复制了Windows Forms应用程序,删除了Windows Forms相关的内容。没有任何构建错误或警告。 - Kat
我尝试创建一个空的ASP.NET应用程序。这次我只使用了x86 DLL,但是当我添加AForge、Video.FFMPEG DLL时,就会出现一个错误,提示无法找到该程序集。它不再提到尝试加载格式不正确的程序。 - Kat
Visual Studio也会发出警告。它特别提到一个页面,并在该文件中的ASP.NET标记下放置了那个波浪线,指出“无法加载文件或程序集'AForge.Video.FFMPEG.DLL'或其某个依赖项。指定的模块无法找到。”这很奇怪,因为我的代码尚未引用此程序集,一旦我删除程序集,一切都正常工作。当然,我需要这个程序集... - Kat
也许值得注意的是,DLL 在对象浏览器中是可见的。路径正确,对象浏览器正确显示 DLL 中的对象。因此它并没有损坏或其他问题,似乎是可见的。 - Kat
在网上搜索时,我发现有人提到本地DLL将从System32文件夹中加载,而不是bin文件夹,所以我把所有的DLL都复制到了那里。但是没有任何变化。实际上,我并没有期望会有变化,因为Visual Studio警告过我(至少VS应该知道这个程序集)。 - Kat
如果有人想测试或复制此问题的项目,请点击这里获取项目文件。其中代码非常少,基本上只有DLL文件。 - Kat
3个回答

2
我遇到了同样的问题。现在它工作得很好。我做了几件事情,虽然我不确定哪一件实际上使我的应用程序工作。
1. 从“Externals\ffmpeg\bin”中复制DLL到项目的输出目录(可执行文件所在的位置); 2. 同样将这些.dll文件复制到C:/Windows/System32目录中; 3. 设置为x86目标构建(以32位模式运行); 4. 虽然我的项目基于4.5框架,但我也安装了v3.5; 5. 最后,在app.config中添加useLegacyV2RuntimeActivationPolicy="true" -
 <?xml version="1.0" encoding="utf-8"?>
 <configuration>
   <startup useLegacyV2RuntimeActivationPolicy="true"> //useLegacyV2RuntimeActivationPolicy for older .net version
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
   </startup>    
 </configuration>

我认为这是第三步,因为我一直在找论坛,他们说它不兼容x64,比如这里。我不确定其余的步骤是否有任何影响。 - Alex

1
我找到了一个解决方案。不知何故,将FFmpeg DLL文件(avformat-53.dll、avutil-51.dll等)放在C:\Windows\System32文件夹中就可以了。
我不明白为什么DLL文件不能直接放在路径中。而且,在这个位置放置DLL文件非常不方便。
由于这种方法并不理想,我会暂时不接受它作为答案,希望有人能提供更好的解决方案或者至少解释一下为什么路径或System32没有起作用。

嗨,Mike,自你写这篇文章以来还有更多的进展吗? - James Mundy
1
@JamesMundy,实际上是的,但我不认为我的解决方案更好。它对环境的设置较少,但对代码的工作量较大。我“简单地”在Application_Start中加载了本机DLL(任何需要之前的时间都可以)。这需要调用Win32代码(使用DllImport属性从Kernel32.dll获取LoadLibrary)。然后,我的代码依赖于本机DLL的部分必须动态加载该程序集(使用Assembly类)。这意味着每个Aforge.FFmpeg方法必须通过反射调用。它有点丑陋,但它有效。 - Kat

1

我发现当我按照以下步骤操作时(在您的项目中使用AForge DLL并将其引用),此错误得到了解决:

  1. 右键单击您的项目-->选择属性
  2. 点击“生成”(在左侧)
  3. 将平台目标更改为X86

看看这是否有帮助,对我有效!


1
适用于我。Visual Studio 2015,MVC Web应用程序。 - pixparker

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