MVC4 应用程序“无法加载 DLL 'libmp3lame.32.dll'

Posted

技术标签:

【中文标题】MVC4 应用程序“无法加载 DLL \'libmp3lame.32.dll\'【英文标题】:MVC4 App "Unable to load DLL 'libmp3lame.32.dll'MVC4 应用程序“无法加载 DLL 'libmp3lame.32.dll' 【发布时间】:2013-11-20 06:13:26 【问题描述】:

我正在尝试在 MVC4 应用程序中使用 NAudio.Lame 库并收到错误:

Unable to load DLL 'libmp3lame.32.dll': The specified module could not be found.

我通过 NuGet 添加了库。我能够让库与 Windows 窗体应用程序一起正常工作,所以我相信问题是 MVC4 特有的。

我在这里尝试了图书馆作者的建议: https://***.com/a/20065606/910348

【问题讨论】:

啊,你来了:)答案来了... 【参考方案1】:

问题原来是无法找到本机 DLL(libmp3lame.32.dlllibmp3lame.64.dll),因为执行 Web 服务器进程的当前目录不是网站的 bin 文件夹(DLL 所在的位置) ) 并且搜索路径不包括bin 文件夹。

您需要将bin 文件夹添加到PATH 环境变量,这将使LoadLibrary API 调用能够定位DLL。

您可以调用以下方法为您完成此操作:

public static void CheckAddBinPath()

    // find path to 'bin' folder
    var binPath = Path.Combine(new string[]  AppDomain.CurrentDomain.BaseDirectory, "bin" );
    // get current search path from environment
    var path = Environment.GetEnvironmentVariable("PATH") ?? "";

    // add 'bin' folder to search path if not already present
    if (!path.Split(Path.PathSeparator).Contains(binPath, StringComparer.CurrentCultureIgnoreCase))
    
        path = string.Join(Path.PathSeparator.ToString(), new string[]  path, binPath );
        Environment.SetEnvironmentVariable("PATH", path);
    

将它放在您的控制器中并在您创建 LameMP3FileWriter 实例之前调用它。如果你把它放在Global.asax.cs 并从Application_Start() 调用它,它可能会起作用。试试看,让我知道它是否在那里有效。

我在项目网站here 上放了一篇关于此的 Wiki 文章。

【讨论】:

当您在 mediumTrust 中运行应用程序时,这将失败并出现 SecurityException。有没有更好的办法? @llapinski 我不必处理中等信任执行,所以不确定它有什么影响。以上失败在哪里?您是否能够编辑 PATH 环境变量或将相关的本机 DLL 复制到 PATH 上的某个位置? 您不能事件读取路径,否则它会抛出 SecurityException 并显示消息“请求类型'System.Security.Permissions.EnvironmentPermission,mscorlib,版本 = 4.0.0.0 的权限。我还没有知道客户是否能够在他的主机上编辑路径。这是解决方法吗?只需手动将 bin 位置添加到路径吗?IIS 不会将其复制到某个临时位置? @llapinski 是的,您可以手动编辑路径以添加项目的 bin 文件夹,或将本机 DLL 移动到路径上的文件夹中。要么应该工作。不幸的是,您不能像使用 .NET 程序集那样从内存中加载它们。 这有助于我的 Azure 部署。【参考方案2】:

将以下行添加到您网站的 web.config 中。这将防止 IIS 从临时文件夹复制文件和执行您的站点(本机 dll 显然不会被复制)。缺点是每次将更改推送到 bin 文件夹时都必须重新启动应用程序池,因为 IIS 会将文件锁定在那里。

<system.web>
    <hostingEnvironment shadowCopyBinAssemblies="false" />
    ...
</system.web>

【讨论】:

+1d 这个答案,但它有它自己的问题。如果您禁用卷影副本,VS 将锁定该 dll,并且构建项目会很麻烦,因为它不会获得锁,它会在构建时获得拒绝访问异常【参考方案3】:

很可能 IIS 无法找到本机 dll。请务必将本机 dll 文件放入 Windows DLL search path locations 之一。

【讨论】:

【参考方案4】:

我通过将 LameDLLWrap 程序集作为一个单独的程序集来使其工作,而不是将其嵌入到主程序集中。因为我知道我的目标系统是 32 位的,所以我可以负担得起一个程序集——这对我来说比在宿主机器上玩 PATH 更简单。

这就是我所做的:

    克隆了源代码 查看 Experimental 分支 从主项目中删除了嵌入式程序集 将对包装器的引用设置为复制本地 重新编译所有内容

【讨论】:

以上是关于MVC4 应用程序“无法加载 DLL 'libmp3lame.32.dll'的主要内容,如果未能解决你的问题,请参考以下文章

注销 MVC4 应用程序

如何为 C# MVC4 WebAPI 应用程序全局记录所有异常?

编写新的自定义 mvc4 成员提供程序

MVC4 oauth facebook 访问用户和朋友权限:

我无法在 VS2012 中将服务引用(WCF 库)添加到 MVC4

尝试在 AppHarbor 上查看我的 MVC4 应用程序时出现 403 错误(禁止)