我目前正在尝试在C#程序中为学校项目使用一个简单的C ++ DLL,但是我无法将DLL和Program相互链接。当我尝试在主程序中调用DLL的函数时,我从DLL中抛出了一个SEHExcpetion。
这是DLL代码
#include <stdio.h>
#include <string>
using namespace std;
extern "C"
{
__declspec(dllexport) string Crypter(string sIn)
{
return sIn+ " from DLL";
}
}
这是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 WindowsFormsApplication1
{
public partial class Form1 : Form
{
[DllImport("CryptoDLL2.dll")]
public static extern string Crypter(string sIn);
public Form1()
{
InitializeComponent();
}
private void BTN_Crypter_Click(object sender, EventArgs e)
{
TB_OUT.Text = ("");
TB_OUT.Text = Crypter(TB_IN.Text); //exception thrown here
}
}
}
答案 0 :(得分:2)
C#和C ++中的字符串 - 这些是完全不同的类型,布局等。您希望它们能够正常工作。
通过编组检查char *。
答案 1 :(得分:0)
你不能使用C#中的std :: string,它是一个c ++类,.NET不知道如何处理它。
尝试使用wchar_t *或BSTR。
答案 2 :(得分:0)
我做了一个测试,以确保链接很好,这是一个示例应用程序,显示它确实有效。
#include <stdio.h>
#include <string>
using namespace std;
extern "C"
{
__declspec(dllexport) string Crypter(string sIn)
{
printf("test");
return "from DLL";
}
}
和
public class Test
{
[DllImport("TestDll.dll")]
public static extern string Crypter(string sIn);
static void Main(string[] args)
{
Console.WriteLine(Crypter("a"));
}
}
这打印出我
test
后面跟换行。
您可能需要将数据从c ++封送到.net,或者使用c ++ / clr托管的dll,这样可以让您更轻松。