此C#程序无需使用showdialog()即可正常运行,但是当我尝试使用showdialog()时会创建“系统访问冲突”异常。奇怪的!!

C#代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace w_CSharp_GUI_1
{
    public partial class Form1 : Form
    {
        private String W_Addr,C_Addr,Pic_Addr="lol";

        [DllImport("face_proj_trial_dll.dll")]
        public static extern string f_detect(string path);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
        OpenFileDialog openFileDialog2 = new OpenFileDialog();

        openFileDialog2.ShowDialog(this);

            Pic_Addr = (f_detect("C:\\pic.jpg"));

            textBox1.Text = Convert.ToString(Pic_Addr);
        }

    }
}


C ++代码:

#include "face_detect_DLL.h"

extern "C" __declspec(dllexport) char* _stdcall f_detect(char* path)
{
    return path;
}

最佳答案

这一点也不奇怪。您将返回一个实际由C#编组创建的C字符串。然后,编组器尝试释放该内存两次。一次作为返回值,一次用于将参数传递给DLL。第一次释放将失败,因为未使用C#marshaller假定的分配器分配内存。

无论如何,您根本不想从DLL返回char*。我不确定您真正想做什么,但是带有字符串P / invokes的普通模式是:


对于从C#到C ++的字符串编组,在C#中将它们声明为string,在C ++中将它们声明为char*
当采用其他方式时,请使用StringBuilder。在调用和使用MarshalAs之前分配一个缓冲区。网络上有无数个这种模式的例子。

关于c# - 由于导入C++ DLL,C#ShowDialog()引发错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7515481/

10-11 16:24