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.dll
和 libmp3lame.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'的主要内容,如果未能解决你的问题,请参考以下文章
如何为 C# MVC4 WebAPI 应用程序全局记录所有异常?
MVC4 oauth facebook 访问用户和朋友权限: