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 に答える