此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/