奇异的Pinvoke调用

    我们的一个C#项目需要调用C++的dll,通过Pinvoke进行方法调用。其中的一个方法及其参数的定义是这样的:

    [StructLayoutAttribute    (LayoutKind.Sequential)]
    public struct xvid_gbl_info_t        
    {
        /// int
        public int version;

        
/// int
        public int actual_version;

        
/// char*
        [MarshalAsAttribute(UnmanagedType.LPStr)]
        public string build;

        
/// unsigned int
        public uint cpu_flags;

        
/// int
        public int num_threads;
    }
 
    [
DllImportAttribute("xvidcore", EntryPoint = "xvid_global")]
    
public static extern int xvid_global(IntPtr handle, int opt, ref xvid_gbl_info_t param1, IntPtr param2); 

    在做demo时,一切正常,而且在测试的7台电脑上均能正常运行。

    但到正式项目中,完全一样的调用模式,却有3台电脑正常运行,4台电脑执行到该方法时就报错:“有未处理的异常,堆已损坏。”

    昨天晚上搞到半夜,仍然是如此,奇怪!希望有大侠能指教一二,感激不尽。

 

   注:问题已经解决,原因是不能调用静态方法和成员,如果先调用了静态方法和成员,再调用Pinvoke上面的方法,在某些机器上就会抛出异常。但是为何会这样奇怪了?不得其解。

 

 

posted on 2011-07-07 09:07 zhuweisky 阅读(493) 评论(3) 编辑 收藏

评论

#1楼 2011-07-07 09:09 博客园团队      

建议在博问(http://home.cnblogs.com/q/)中提问。  回复 引用 查看   

#2楼 2011-07-07 09:13 Kevin.Jee      

很正常啊,可能是环境不同吧 :)

教你个方法,能看出为什么堆已损坏,你用WINDBG调试你的程序,当出现异常后,break,然后使用一个类似于"Verify*"的命令来验证堆的完整性,如果不完整,他就会告诉你相关信息的~.



 回复 引用 查看   

#3楼 2011-07-08 19:52 toEverybody      

.NET的互操作怪异,还 不如直接用C++  回复 引用 查看   

导航

公告

             

人的灵魂要强,

接受人的脆弱。

昵称:zhuweisky
园龄:6年7个月
荣誉:推荐博客
粉丝:210
关注:10

统计

搜索

 
 

随笔分类(267)

随笔档案(283)

积分与排名

最新评论

阅读排行榜

推荐排行榜