无法加载MediaInfo库

在我的C#项目中使用Mediainfo库,在开始调用这个dll之前,我刚刚运行了随包附带的VC ++程序并部署到我的本地system.am不确定它在部署时究竟做了什么,它在系统中注册了一些东西,所以我的进程可以识别mediainfo.dll,所以它在我的本地(32位)运行良好。

当我开始在Testserver中部署时,我无法运行或部署VC ++(bcoz测试服务器没有可视工作室来执行此操作,除了调试器)。所以我收到此错误

public class MediaInfo { //Import of DLL functions. DO NOT USE until you know what you do (MediaInfo DLL do NOT use CoTaskMemAlloc to allocate memory) [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfo_New(); //MediaInfo class public String Inform() { if (Handle == (IntPtr)0) return "Unable to load MediaInfo library"; if (MustUseAnsi) return Marshal.PtrToStringAnsi(MediaInfoA_Inform(Handle, (IntPtr)0)); else return Marshal.PtrToStringUni(MediaInfo_Inform(Handle, (IntPtr)0)); } public String Get(StreamKind StreamKind, int StreamNumber, String Parameter, InfoKind KindOfInfo, InfoKind KindOfSearch) { if (Handle == (IntPtr)0) return "Unable to load MediaInfo library"; if (MustUseAnsi) { IntPtr Parameter_Ptr=Marshal.StringToHGlobalAnsi(Parameter); String ToReturn=Marshal.PtrToStringAnsi(MediaInfoA_Get(Handle, (IntPtr)StreamKind, (IntPtr)StreamNumber, Parameter_Ptr, (IntPtr)KindOfInfo, (IntPtr)KindOfSearch)); Marshal.FreeHGlobal(Parameter_Ptr); return ToReturn; } else return Marshal.PtrToStringUni(MediaInfo_Get(Handle, (IntPtr)StreamKind, (IntPtr)StreamNumber, Parameter, (IntPtr)KindOfInfo, (IntPtr)KindOfSearch)); } public String Get(StreamKind StreamKind, int StreamNumber, int Parameter, InfoKind KindOfInfo) { if (Handle == (IntPtr)0) return "Unable to load MediaInfo library"; if (MustUseAnsi) return Marshal.PtrToStringAnsi(MediaInfoA_GetI(Handle, (IntPtr)StreamKind, (IntPtr)StreamNumber, (IntPtr)Parameter, (IntPtr)KindOfInfo)); else return Marshal.PtrToStringUni(MediaInfo_GetI(Handle, (IntPtr)StreamKind, (IntPtr)StreamNumber, (IntPtr)Parameter, (IntPtr)KindOfInfo)); } public String Option(String Option, String Value) { if (Handle == (IntPtr)0) return "Unable to load MediaInfo library"; if (MustUseAnsi) { IntPtr Option_Ptr=Marshal.StringToHGlobalAnsi(Option); IntPtr Value_Ptr=Marshal.StringToHGlobalAnsi(Value); String ToReturn=Marshal.PtrToStringAnsi(MediaInfoA_Option(Handle, Option_Ptr, Value_Ptr)); Marshal.FreeHGlobal(Option_Ptr); Marshal.FreeHGlobal(Value_Ptr); return ToReturn; } else return Marshal.PtrToStringUni(MediaInfo_Option(Handle, Option, Value)); } public int State_Get() { if (Handle == (IntPtr)0) return 0; return (int)MediaInfo_State_Get(Handle); } public int Count_Get(StreamKind StreamKind, int StreamNumber) { if (Handle == (IntPtr)0) return 0; return (int)MediaInfo_Count_Get(Handle, (IntPtr)StreamKind, (IntPtr)StreamNumber); } private IntPtr Handle; private bool MustUseAnsi; //Default values, if you know how to set default values in C#, say me public String Get(StreamKind StreamKind, int StreamNumber, String Parameter, InfoKind KindOfInfo) { return Get(StreamKind, StreamNumber, Parameter, KindOfInfo, InfoKind.Name); } public String Get(StreamKind StreamKind, int StreamNumber, String Parameter) { return Get(StreamKind, StreamNumber, Parameter, InfoKind.Text, InfoKind.Name); } public String Get(StreamKind StreamKind, int StreamNumber, int Parameter) { return Get(StreamKind, StreamNumber, Parameter, InfoKind.Text); } public String Option(String Option_) { return Option(Option_, ""); } public int Count_Get(StreamKind StreamKind) { return Count_Get(StreamKind, -1); } } 

只是google通过SourceForge.net发现这个https://sourceforge.net/projects/mediainfo/forums/forum/297610/topic/4037237但我仍然不知道他们的建议。

看起来他们要求导入com对象,但是有人请指导我如何在C#中导入com对象?

一些如何导入dll失败,这是任何其他方式导入或只是给路径找到DLL?

喜欢

 PathToMediaInfoDLL := "C:\Documents and Settings\Administrator\My Documents\autohotkey\MediaInfo.dll" 

提前感谢一堆。

要在c#中运行MediaInfo,您不需要运行任何VC ++。 只需下载二进制文件。 但是你需要记住一些事情:

第一:使用正确版本的mediainfo.dll x32或x64。

第二:路径是媒体库需要系统可见。 因此,MediaInfo.dll与应用程序位于同一文件夹中,或者文件夹添加到系统路径中。

第三:使用附加到库c#包装器类来更容易互操作。

下面是从源forge下载的正确包装类:

 // MediaInfoDLL - All info about media files, for DLL // Copyright (C) 2002-2009 Jerome Martinez, Zen@MediaArea.net // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // MediaInfoDLL - All info about media files, for DLL // Copyright (C) 2002-2009 Jerome Martinez, Zen@MediaArea.net // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // Microsoft Visual C# wrapper for MediaInfo Library // See MediaInfo.h for help // // To make it working, you must put MediaInfo.Dll // in the executable folder // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ using System; using System.Runtime.InteropServices; namespace MediaInfoLib { public enum StreamKind { General, Video, Audio, Text, Chapters, Image } public enum InfoKind { Name, Text, Measure, Options, NameText, MeasureText, Info, HowTo } public enum InfoOptions { ShowInInform, Support, ShowInSupported, TypeOfValue } public enum InfoFileOptions { FileOption_Nothing = 0x00, FileOption_NoRecursive = 0x01, FileOption_CloseAll = 0x02, FileOption_Max = 0x04 }; public class MediaInfo { //Import of DLL functions. DO NOT USE until you know what you do (MediaInfo DLL do NOT use CoTaskMemAlloc to allocate memory) [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfo_New(); [DllImport("MediaInfo.dll")] private static extern void MediaInfo_Delete(IntPtr Handle); [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfo_Open(IntPtr Handle, [MarshalAs(UnmanagedType.LPWStr)] string FileName); [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfoA_Open(IntPtr Handle, IntPtr FileName); [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfo_Open_Buffer_Init(IntPtr Handle, Int64 File_Size, Int64 File_Offset); [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfoA_Open(IntPtr Handle, Int64 File_Size, Int64 File_Offset); [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfo_Open_Buffer_Continue(IntPtr Handle, IntPtr Buffer, IntPtr Buffer_Size); [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfoA_Open_Buffer_Continue(IntPtr Handle, Int64 File_Size, byte[] Buffer, IntPtr Buffer_Size); [DllImport("MediaInfo.dll")] private static extern Int64 MediaInfo_Open_Buffer_Continue_GoTo_Get(IntPtr Handle); [DllImport("MediaInfo.dll")] private static extern Int64 MediaInfoA_Open_Buffer_Continue_GoTo_Get(IntPtr Handle); [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfo_Open_Buffer_Finalize(IntPtr Handle); [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfoA_Open_Buffer_Finalize(IntPtr Handle); [DllImport("MediaInfo.dll")] private static extern void MediaInfo_Close(IntPtr Handle); [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfo_Inform(IntPtr Handle, IntPtr Reserved); [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfoA_Inform(IntPtr Handle, IntPtr Reserved); [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfo_GetI(IntPtr Handle, IntPtr StreamKind, IntPtr StreamNumber, IntPtr Parameter, IntPtr KindOfInfo); [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfoA_GetI(IntPtr Handle, IntPtr StreamKind, IntPtr StreamNumber, IntPtr Parameter, IntPtr KindOfInfo); [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfo_Get(IntPtr Handle, IntPtr StreamKind, IntPtr StreamNumber, [MarshalAs(UnmanagedType.LPWStr)] string Parameter, IntPtr KindOfInfo, IntPtr KindOfSearch); [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfoA_Get(IntPtr Handle, IntPtr StreamKind, IntPtr StreamNumber, IntPtr Parameter, IntPtr KindOfInfo, IntPtr KindOfSearch); [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfo_Option(IntPtr Handle, [MarshalAs(UnmanagedType.LPWStr)] string Option, [MarshalAs(UnmanagedType.LPWStr)] string Value); [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfoA_Option(IntPtr Handle, IntPtr Option, IntPtr Value); [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfo_State_Get(IntPtr Handle); [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfo_Count_Get(IntPtr Handle, IntPtr StreamKind, IntPtr StreamNumber); //MediaInfo class public MediaInfo() { Handle = MediaInfo_New(); if (Environment.OSVersion.ToString().IndexOf("Windows")==-1) MustUseAnsi=true; else MustUseAnsi=false; } ~MediaInfo() { MediaInfo_Delete(Handle); } public int Open(String FileName) { if (MustUseAnsi) { IntPtr FileName_Ptr = Marshal.StringToHGlobalAnsi(FileName); int ToReturn = (int)MediaInfoA_Open(Handle, FileName_Ptr); Marshal.FreeHGlobal(FileName_Ptr); return ToReturn; } else return (int)MediaInfo_Open(Handle, FileName); } public int Open_Buffer_Init(Int64 File_Size, Int64 File_Offset) { return (int)MediaInfo_Open_Buffer_Init(Handle, File_Size, File_Offset); } public int Open_Buffer_Continue(IntPtr Buffer, IntPtr Buffer_Size) { return (int)MediaInfo_Open_Buffer_Continue(Handle, Buffer, Buffer_Size); } public Int64 Open_Buffer_Continue_GoTo_Get() { return (int)MediaInfo_Open_Buffer_Continue_GoTo_Get(Handle); } public int Open_Buffer_Finalize() { return (int)MediaInfo_Open_Buffer_Finalize(Handle); } public void Close() { MediaInfo_Close(Handle); } public String Inform() { if (MustUseAnsi) return Marshal.PtrToStringAnsi(MediaInfoA_Inform(Handle, (IntPtr)0)); else return Marshal.PtrToStringUni(MediaInfo_Inform(Handle, (IntPtr)0)); } public String Get(StreamKind StreamKind, int StreamNumber, String Parameter, InfoKind KindOfInfo, InfoKind KindOfSearch) { if (MustUseAnsi) { IntPtr Parameter_Ptr=Marshal.StringToHGlobalAnsi(Parameter); String ToReturn=Marshal.PtrToStringAnsi(MediaInfoA_Get(Handle, (IntPtr)StreamKind, (IntPtr)StreamNumber, Parameter_Ptr, (IntPtr)KindOfInfo, (IntPtr)KindOfSearch)); Marshal.FreeHGlobal(Parameter_Ptr); return ToReturn; } else return Marshal.PtrToStringUni(MediaInfo_Get(Handle, (IntPtr)StreamKind, (IntPtr)StreamNumber, Parameter, (IntPtr)KindOfInfo, (IntPtr)KindOfSearch)); } public String Get(StreamKind StreamKind, int StreamNumber, int Parameter, InfoKind KindOfInfo) { if (MustUseAnsi) return Marshal.PtrToStringAnsi(MediaInfoA_GetI(Handle, (IntPtr)StreamKind, (IntPtr)StreamNumber, (IntPtr)Parameter, (IntPtr)KindOfInfo)); else return Marshal.PtrToStringUni(MediaInfo_GetI(Handle, (IntPtr)StreamKind, (IntPtr)StreamNumber, (IntPtr)Parameter, (IntPtr)KindOfInfo)); } public String Option(String Option, String Value) { if (MustUseAnsi) { IntPtr Option_Ptr=Marshal.StringToHGlobalAnsi(Option); IntPtr Value_Ptr=Marshal.StringToHGlobalAnsi(Value); String ToReturn=Marshal.PtrToStringAnsi(MediaInfoA_Option(Handle, Option_Ptr, Value_Ptr)); Marshal.FreeHGlobal(Option_Ptr); Marshal.FreeHGlobal(Value_Ptr); return ToReturn; } else return Marshal.PtrToStringUni(MediaInfo_Option(Handle, Option, Value)); } public int State_Get() { return (int)MediaInfo_State_Get(Handle); } public int Count_Get(StreamKind StreamKind, int StreamNumber) { return (int)MediaInfo_Count_Get(Handle, (IntPtr)StreamKind, (IntPtr)StreamNumber); } private IntPtr Handle; private bool MustUseAnsi; //Default values, if you know how to set default values in C#, say me public String Get(StreamKind StreamKind, int StreamNumber, String Parameter, InfoKind KindOfInfo) { return Get(StreamKind, StreamNumber, Parameter, KindOfInfo, InfoKind.Name); } public String Get(StreamKind StreamKind, int StreamNumber, String Parameter) { return Get(StreamKind, StreamNumber, Parameter, InfoKind.Text, InfoKind.Name); } public String Get(StreamKind StreamKind, int StreamNumber, int Parameter) { return Get(StreamKind, StreamNumber, Parameter, InfoKind.Text); } public String Option(String Option_) { return Option(Option_, ""); } public int Count_Get(StreamKind StreamKind) { return Count_Get(StreamKind, -1); } } public class MediaInfoList { //Import of DLL functions. DO NOT USE until you know what you do (MediaInfo DLL do NOT use CoTaskMemAlloc to allocate memory) [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfoList_New(); [DllImport("MediaInfo.dll")] private static extern void MediaInfoList_Delete(IntPtr Handle); [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfoList_Open(IntPtr Handle, [MarshalAs(UnmanagedType.LPWStr)] string FileName, IntPtr Options); [DllImport("MediaInfo.dll")] private static extern void MediaInfoList_Close(IntPtr Handle, IntPtr FilePos); [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfoList_Inform(IntPtr Handle, IntPtr FilePos, IntPtr Reserved); [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfoList_GetI(IntPtr Handle, IntPtr FilePos, IntPtr StreamKind, IntPtr StreamNumber, IntPtr Parameter, IntPtr KindOfInfo); [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfoList_Get(IntPtr Handle, IntPtr FilePos, IntPtr StreamKind, IntPtr StreamNumber, [MarshalAs(UnmanagedType.LPWStr)] string Parameter, IntPtr KindOfInfo, IntPtr KindOfSearch); [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfoList_Option(IntPtr Handle, [MarshalAs(UnmanagedType.LPWStr)] string Option, [MarshalAs(UnmanagedType.LPWStr)] string Value); [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfoList_State_Get(IntPtr Handle); [DllImport("MediaInfo.dll")] private static extern IntPtr MediaInfoList_Count_Get(IntPtr Handle, IntPtr FilePos, IntPtr StreamKind, IntPtr StreamNumber); //MediaInfo class public MediaInfoList() { Handle = MediaInfoList_New(); } ~MediaInfoList() { MediaInfoList_Delete(Handle); } public int Open(String FileName, InfoFileOptions Options) { return (int)MediaInfoList_Open(Handle, FileName, (IntPtr)Options); } public void Close(int FilePos) { MediaInfoList_Close(Handle, (IntPtr)FilePos); } public String Inform(int FilePos) { return Marshal.PtrToStringUni(MediaInfoList_Inform(Handle, (IntPtr)FilePos, (IntPtr)0)); } public String Get(int FilePos, StreamKind StreamKind, int StreamNumber, String Parameter, InfoKind KindOfInfo, InfoKind KindOfSearch) { return Marshal.PtrToStringUni(MediaInfoList_Get(Handle, (IntPtr)FilePos, (IntPtr)StreamKind, (IntPtr)StreamNumber, Parameter, (IntPtr)KindOfInfo, (IntPtr)KindOfSearch)); } public String Get(int FilePos, StreamKind StreamKind, int StreamNumber, int Parameter, InfoKind KindOfInfo) { return Marshal.PtrToStringUni(MediaInfoList_GetI(Handle, (IntPtr)FilePos, (IntPtr)StreamKind, (IntPtr)StreamNumber, (IntPtr)Parameter, (IntPtr)KindOfInfo)); } public String Option(String Option, String Value) { return Marshal.PtrToStringUni(MediaInfoList_Option(Handle, Option, Value)); } public int State_Get() { return (int)MediaInfoList_State_Get(Handle); } public int Count_Get(int FilePos, StreamKind StreamKind, int StreamNumber) { return (int)MediaInfoList_Count_Get(Handle, (IntPtr)FilePos, (IntPtr)StreamKind, (IntPtr)StreamNumber); } private IntPtr Handle; //Default values, if you know how to set default values in C#, say me public void Open(String FileName) { Open(FileName, 0); } public void Close() { Close(-1); } public String Get(int FilePos, StreamKind StreamKind, int StreamNumber, String Parameter, InfoKind KindOfInfo) { return Get(FilePos, StreamKind, StreamNumber, Parameter, KindOfInfo, InfoKind.Name); } public String Get(int FilePos, StreamKind StreamKind, int StreamNumber, String Parameter) { return Get(FilePos, StreamKind, StreamNumber, Parameter, InfoKind.Text, InfoKind.Name); } public String Get(int FilePos, StreamKind StreamKind, int StreamNumber, int Parameter) { return Get(FilePos, StreamKind, StreamNumber, Parameter, InfoKind.Text); } public String Option(String Option_) { return Option(Option_, ""); } public int Count_Get(int FilePos, StreamKind StreamKind) { return Count_Get(FilePos, StreamKind, -1); } } } //NameSpace 

只需将“MediaInfo.dll”添加到文件夹“YourVisualStudioProjectPath \ bin \ Debug \”(来自Debugging创建的VisualStudio;已编译的“* .exe”文件就在那里……)