2012-03-05 66 views
0

在我的C#项目中使用Mediainfo库,在开始调用这个DLL之前,我刚刚运行了包含在程序包中的VC++程序,并部署到我的本地系统中.am不知道它到底做了什么部署,它在系统中注册了一些东西,所以我的过程可以识别mediainfo.dll,所以它在我的本地(32位)中运行良好。无法加载MediaInfo库

当我开始在TESTSERVER部署,我不能运行或部署VC++(bcoz测试服务器没有Visual Studio来做到这一点,除了调试器)。所以我得到这个错误

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); } 
} 

只是谷歌通过SourceForge.net发现这https://sourceforge.net/projects/mediainfo/forums/forum/297610/topic/4037237但我仍然不知道他们在暗示什么。

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

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

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

多谢提前。

回答

4

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

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

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

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

下面是适当的包装类从源锻造dowloaded:

// MediaInfoDLL - All info about media files, for DLL 
// Copyright (C) 2002-2009 Jerome Martinez, [email protected] 
// 
// 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, [email protected] 
// 
// 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 
+0

,感谢您的评论,请你引导我你的“第二”点。我怎么才能找到路径或如何让过程知道路径DLL是? – Usher

+0

您需要将MediaInfo添加到System Enviroment Paths中。 _Computer->属性 - >高级 - > Environment_。对不起,缺乏正确的名字,但我没有英文操作系统。 – Marcin

+0

我可能会打扰一点,对此感到抱歉。很少有人使用这个DLL,我现在唯一的希望就是在我的测试服务器上解决这个问题。在我的桌面上找到它。我从桌面创建一个安装项目并安装在我的测试server.it安装在c:\ programfiles \ CadProject。在这个项目下,我可以看到它有mediainfo的dll,但一些如何不指出或寻找别的地方。提前一吨感谢 – Usher

2

简单地添加 “MediaInfo.dll” 从由VisualStudio的调试创建的文件夹 “YourVisualStudioProjectPath \ BIN \调试\”(;所述编译“* .exe”文件是否有...)