C#使用MediaInfo.dll发布应用程序

时间:2013-03-03 10:29:29

标签: c# dllimport mediainfo

我已经构建了一个程序,可以使用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的任何想法?

2 个答案:

答案 0 :(得分: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而未找到它。

答案 1 :(得分:1)

您可以尝试以下其中一项 -

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

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