我正在编写一个使用最新MediaInfoLib Dll的C#.NET 3.5程序 它似乎导致某些文件的异常。
我想抓住这些例外并确保我的程序继续运行,
但由于某种原因,我无法通过简单的try / catch语句来捕获它。
PInvoke方法:
[DllImport("MediaInfo.dll")]
private static extern IntPtr MediaInfo_New();
[DllImport("MediaInfo.dll")]
private static extern IntPtr MediaInfo_Open(IntPtr Handle,MarshalAs(UnmanagedType.LPWStr)] string FileName);
用法:
Handle = MediaInfo_New();
try{
MediaInfo_Open(Handle, FileName)
} catch { }
调用MediaInfo_Open(Handle,FileName)可能会导致异常 我的程序退出并且“vshost32-clr2.exe”崩溃,而不是使用try / catch语句捕获错误。 (它也会在发布版本中崩溃并且没有附带调试器) 搜索完网页后,我发现有人建议检查“启用非托管代码调试”,这只导致我的程序退出而没有vshost32-clr2.exe崩溃。
知道如何捕获异常吗?
答案 0 :(得分:7)
如果非托管DLL导致崩溃(而不仅仅是返回某种错误代码),那么就无法捕获它。一旦你超出.NET运行时的控制范围,它完全取决于非托管代码; .NET运行时没有什么可以做的。
答案 1 :(得分:0)
我遇到过类似的问题(特别是BSTR),但希望这会有所帮助。
当从非托管代码内部编组字符串时,.NET中存在一个错误(在4.0中已修复)。 More Info
解决方法是将P / Invoke签名更改为使用IntPtr并自行执行字符串编组。
[DllImport("MediaInfo.dll", EntryPoint = "MediaInfo_Open")]
private static extern IntPtr _MediaInfo_Open(IntPtr handle, IntPtr filename);
internal static extern IntPtr MediaInfo_Open(IntPtr handle, string filename)
{
IntPtr stringPtr = Marshal.StringToBSTR(filename);
return _MediaInfo_Open(handle, stringPtr);
}