2

我已经构建了一个程序,它将使用 MediaInfo.dll 读取 mkv 文件的一些视频和音频信息。

该程序在从源代码运行时运行完美,并将 dll 放在bin文件夹中。

现在我想发布我的应用程序并能够继续使用它。MediaInfo.dll不再找到该库。我尝试将它放入C:\WIndows\或放入C:\Windows\system32,但没有运气。如果我运行安装程序(发布后),程序安装在同一位置(我不想要这个,但这是另一个问题)。我也尝试将 dll 放入该文件夹中。

向我抛出错误的代码是:

try{
  Handle = MediaInfo_New();
}
catch (Exception ex){
                Handle = (IntPtr)0;
Console.Out.WriteLine(ex.ToString());
}

错误抛出是System.BadImageFormatExceptionor System.DllNotFoundException: Unable to load DLL 'MediaInfo.dll'

关于在哪里放置 dll 的任何想法?

4

2 回答 2

4

您需要将 DLL 部署到复制 EXE 的同一目录中。

您遇到了 BadImageFormatException 问题并且没有看到 c:\windows\system32 工作,因为您正在将程序部署在引导 64 位版本 Windows 的机器上。但是,您的程序无法在 64 位模式下运行,您需要依赖 32 位本机代码。您需要通过强制您的程序在 32 位模式下运行来解决这个问题。右键单击您的 EXE 项目,属性,构建选项卡,将平台目标设置更改为 x86。将 DLL 复制到 Windows 目录是一个非常糟糕的主意,但在这样的机器上它是 c:\windows\syswow64。 始终支持本地部署,与 EXE 相同的目录。

如果在此之后仍然遇到 DllNotFoundException 问题,那么可能的问题是 MediaInfo.dll 本身依赖于另一个 DLL。这很常见,存储 C 运行时的 DLL 是一种非常常见的依赖项。如果您不知道可能是什么 DLL,那么您可以使用 SysInternals 的 ProcMon 实用程序。您会看到程序正在搜索 DLL,但没有找到它。

于 2013-03-03T13:42:10.140 回答
1

您可以尝试以下方法之一 -

1)将其MediaInfo.dll放在与可执行文件相同的位置。确保您的程序是为正确的目标平台构建的。当目标平台和二进制文件在架构上不匹配时(x86 v/s x64),我经常看到 BadImageFormatException。打包依赖项通常会解决这个问题。

2)在目标机器MediaInfo.dll全局程序集缓存中注册。这可以通过安装程序或简单地使用gacutil.exe来完成。这将使 dll 对目标机器上的所有程序集可见。

于 2013-03-03T14:16:52.357 回答