我已经构建了一个程序,可以使用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.BadImageFormatException
或System.DllNotFoundException: Unable to load DLL 'MediaInfo.dll'
。
关于在哪里放置dll的任何想法?
答案 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对目标计算机上的所有程序集可见。