• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#--尝试读取或写入受保护的内存,这通常指示其他内存已损坏。 ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

记:

  近期在C#中调用别人的DLL的时候有时候出现了 尝试读取或写入受保护的内存 。这通常指示其他内存已损坏 的问题。

 

  错误类型:System.AccessViolationException。 

 

  问题位置:在与C++ dll规定传参的类型用的是string导致

 

  问题原因:C++ string类的字符在内存的储存位置:数据<=16字节,在当前栈区;数据>16字节,在堆区

       C# string是存放在堆区的。

 

  解决方案:在传值的时候用指针,再做转换就好了。

    public class APP_DLL
    {
        [DllImport("ruihua.dll", CallingConvention = CallingConvention.Cdecl)] //引入dll,并设置字符集
        public static extern int test(byte[] src1, int w1, int h1, int channel1, byte[] src2, int w2, int h2, int channel2, string str);
    }

  改为:

    public class APP_DLL
    {
        [DllImport("ruihua.dll", CallingConvention = CallingConvention.Cdecl)] //引入dll,并设置字符集
        public static extern int test(byte[] src1, int w1, int h1, int channel1, byte[] src2, int w2, int h2, int channel2, IntPtr str);
    }

  C# string转IntPtr方法:

  IntPtr ptrIn = Marshal.StringToHGlobalAnsi(obj.ToString());

  C# IntPtr转string方法:

  string retlust = Marshal.PtrToStringAnsi(ptrIn);  

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C语言之静态变量发布时间:2022-07-13
下一篇:
Objective-C在Categroy中创建属性(Property)发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap