PDA

View Full Version : سوال: خطا در استفاده از C++‎ dll در #C



OHidden
پنج شنبه 05 آذر 1394, 12:43 عصر
سلام دوستان
قصد نوشتن فایل dll با C++‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ دارم که از اون در C#‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ استفاده کنم
مشکلی که دارم وقتی خروجی تابع از نوع string باشه خطای زیر صادر میشه

Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
در هردو طرف برنامه بدون خطا اجرا میشه اما در runtime سی شارپ خطای بالا رخ میده

کد بخش ++C نوشته شده با 2008++VC
extern "C" __declspec(dllexport) string SetString();
__declspec(dllexport) string SetString()
{
return "Test";
}

و کد استفاده در #C
[DllImport("C:\\baz.dll", SetLastError = true)]
public static extern string SetString();

private void button1_Click(object sender, EventArgs e)
{
string str = SetString();

}

دوستان لطفا راهنمایی بفرمایید که به چه صورتی میتونم یک ورودی رشته ای دریافت کنم

rahnema1
پنج شنبه 05 آذر 1394, 20:05 عصر
سلام
نمی شه string را فرستاد باید آرایه char بفرستید
یک روش به صورت زیر هست البته مثل یه روش دیگه هم اینه رشته ای که می خواهد خروجی باشه به عنوان ورودی تابع بدید

#include <cstring>
#include <string>
extern "C" __declspec(dllexport) char* SetString();
__declspec(dllexport) char* SetString()
{
std::string str = "Test";
char* ch = new char[str.size() + 1];
return ::strcpy (ch, str.c_str());
}
extern "C" __declspec(dllexport) void FreeString(char* ch);
__declspec(dllexport) void FreeString(char* ch)
{
delete[] ch;
}



using System;
using System.Runtime.InteropServices;

namespace Test
{
public class CPP
{
class Native
{
[DllImport("C:\\baz.dll", SetLastError = true)]
public static extern IntPtr SetString();
[DllImport("C:\\baz.dll", SetLastError = true)]
public static extern void FreeString(IntPtr ptr);
}
public static string SetString(){
IntPtr buf = Native.SetString();
string str = Marshal.PtrToStringAnsi(buf);
Native.FreeString(buf);
return str;
}
}

public class Program
{
public static void Main(string[] args)
{
string str = CPP.SetString();
Console.WriteLine(str);
Console.ReadKey(true);
}
}
}