none
.net 4和.net 2使用P/Invoke时,为什么4会抛出异常,2却正常 RRS feed

  • 问题

  • 【WinForm】我在通过P/Invoke使用mupdf时,碰到了这么一个现象,调用非托管函数时,抛出了异常

    异常信息

    检测到 PInvokeStackImbalance
    Message: 对 PInvoke 函数“StudyWork!WH.HospStudySystem.WorkClient.Helper.MuPdf+NativeMethods::NewContext”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。

    后来我发现编译平台改为.net 2时,运行就能正常通过。.net 4时,就会抛出这个异常。请问4跟2在使用P/Invoke时有什么差别吗?

    出错的代码

    class NativeMethods
    		{
    			const uint FZ_STORE_DEFAULT = 256 << 20;
    			const string DLL = "libmupdf.dll";
    			// please modify the version number to match the FZ_VERSION definition in "fitz\version.h" file
    			const string MuPDFVersion = "1.6";
    
    			[DllImport (DLL, EntryPoint = "fz_new_context_imp")]
    			static extern IntPtr NewContext (IntPtr alloc, IntPtr locks, uint max_store, string version);
    			public static IntPtr NewContext () {
    				return NewContext (IntPtr.Zero, IntPtr.Zero, FZ_STORE_DEFAULT, MuPDFVersion);
    			}
    }

    用IntPtr ctx = NativeMethods.NewContext(); 这行代码调用NetContext()函数时,就会抛出异常。
    非托管的dll可以在这个页面找到,我是按照这个文章示例里的源码编译发现这个.net平台的差异问题的。

    http://www.codeproject.com/Articles/498317/Rendering-PDF-Documents-with-Mupdf-and-P-Invoke-in


    2015年1月13日 18:34

答案

  • 我找到了答案了,大概意思是P/Invoke StackImblance这个异常,本身来说可以忽略掉。

    在.net 2的项目环境下,默认是关掉这个异常检查的。在.net 4下面,默认是开启这个检查的。

    要解决这个问题,可以在ctrl+alt+e的处理异常类型类型设定里,managed debug assistants里把pinvoke statckeimblance的复选框去掉就可以了。

    2015年1月14日 4:40

全部回复

  • 我找到了答案了,大概意思是P/Invoke StackImblance这个异常,本身来说可以忽略掉。

    在.net 2的项目环境下,默认是关掉这个异常检查的。在.net 4下面,默认是开启这个检查的。

    要解决这个问题,可以在ctrl+alt+e的处理异常类型类型设定里,managed debug assistants里把pinvoke statckeimblance的复选框去掉就可以了。

    2015年1月14日 4:40
  • 感谢分享!

    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年1月14日 5:46
    版主