【问题标题】:C# publish application with MediaInfo.dllC# 使用 MediaInfo.dll 发布应用程序
【发布时间】:2013-02-17 13:07:24
【问题描述】:

我已经构建了一个程序,它将使用 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.BadImageFormatExceptionSystem.DllNotFoundException: Unable to load DLL 'MediaInfo.dll'

知道 dll 的放置位置吗?

【问题讨论】:

  • 如果你只是将bin目录下的所有文件复制到其他计算机上怎么办?
  • 不工作。还有其他想法吗?
  • 是否有可能有更准确的错误描述的 innerException?
  • System.DllNotFoundException: 无法加载 DLL 'MediaInfo.dll': 找不到指定的模块。 (来自 HRESULT 的异常:0x8007007E)在 DescriptionMaker.MediaInfo.MediaInfo_New() 在 DescriptionMaker.MediaInfo..ctor()

标签: c# dllimport mediainfo


【解决方案1】:

您需要将 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,但没有找到。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-19
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      相关资源
      最近更新 更多