C#调用C++DLL出现的堆被损坏,说明加载的任何DLL中有Bug

在C#调用MFC中DLL时,出现的问题。 目的是通过DLL导出函数,从MFC代码向界面上的C#代码中传递一个字符串。 


    在MFC中: 

    HTask .H文件中: 

    extern "C" _declspec(dllexport) char * WINAPI Task_GetImagePath(); 

    HTask.cpp文件中: 

    CString my_pathXY; 

    ...... 

    char * WINAPI Task_GetImagePath() 

    { 

        return (LPSTR)(LPCSTR)my_pathXY; 

    } 

   (原来)在WPF中: 

    [DllImport("HTask.dll")] 

    public static extern string Task_GetImagePath();

    ...... 

    string strImagePath = Task_GetImagePath(); 

    之前程序运行良好,上诉代码均可正常执行。但是在加入了WPF代码中加入了流文档打印功能,其中调用了OpenFileDialog选择文件,之后再执行上诉代码就会出现Bug. 

解决方法: 修改WPF中的代码: 

[DllImport("HTask.dll")] 

public extern unsafe static char* Task_GetImagePath(); 

...... 

string strImagePath = ""; 

unsafe 

char *p = Task_GetImagePath(); 

strImagePath = Convert.ToString(Marshal.PtrToStringAnsi((IntPtr)p)); 

按照上诉方法,即在C#代码中使用指针,即不安全代码。所以在VS2010调试的时候需要进行相应的修改:在项目上右键,选择属性,选择生成,将“允许不安全代码”勾选。 上诉方法不是完美的解决方法,使用了不安全代码。如果哪位大神有更好的解决方案欢迎指正批评。本人邮箱 wangshubo1989@126.com 

  • 0
    点赞
  • 3
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值