0

我目前正在尝试在 C# 程序中为学校项目使用简单的 C++ DLL,但我无法使 DLL 和程序相互链接。当我尝试在主程序中调用 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
        }
    }
}
4

3 回答 3

2

C# 和 C++ 中的字符串 - 它们是完全不同的类型、布局等。您希望它们能够工作。

使用编组检查 char*。

于 2012-09-01T19:14:52.597 回答
0

您不能使用 C# 中的 std::string,它是一个 c++ 类,.NET 不知道如何处理它。

尝试使用 wchar_t* 或 BSTR。

于 2012-09-01T19:14:13.520 回答
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,这会使您的工作更轻松。

于 2012-09-01T19:22:28.820 回答