Пытаюсь на C# написать вызов функций из библиотеки на C++. Функции строковые и числовые. Если вызывать только один ну из функций, то все нормально, а если все сразу (как в исходниках снизу) то крешится. Не могу понять в чем ошибки — помогите :]
Библиотека C++:
#if __GNUC__ >= 4
#define DLL_PUBLIC __attribute__ ((visibility("default")))
#define DLL_LOCAL __attribute__ ((visibility("hidden")))
#else
#define DLL_PUBLIC
#define DLL_LOCAL
#endif
#include "cstdlib"
#include "iostream"
#include <string.h>
using namespace std;
//ФУНКЦИИ С ЧИСЛАМИ
///////////////////
//Вычисление процента из чисел полученных от C#
extern "C" DLL_PUBLIC float cpp_get_percent (float from_number, float percent ) {
return from_number*percent/100;
}
//ФУНКЦИИ С ТЕКСТОМ
///////////////////
//Получение строки из C# и отдача строки из C++
extern "C" DLL_PUBLIC char* cpp_set_string (const char* ss) {
char* c;
strcpy(c,ss);
return c;
}
//Отдача строки из C++
extern "C" DLL_PUBLIC char* cpp_get_string () {
char* c;
string ss = "Я строка из C++";
strcpy(c,ss.c_str());
return c;
}
Вызов в C#:
using System;
using System.Runtime.InteropServices;
using System.Text;
namespace scbot_csharp {
class MainClass {
[DllImport("libtest")]
public static extern float cpp_get_percent(float from_number, float percent);
[DllImport("libtest",CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr cpp_set_string(string s);
[DllImport("libtest",CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr cpp_get_string();
static void CppPercent() {
float p = cpp_get_percent(46, 10 );
Console.WriteLine ("Я процент из C++: "+p.ToString());
}
static void CppSetString() {
string s = "Я строка из C# в C++";
IntPtr t = cpp_set_string(s);
String result = Marshal.PtrToStringAuto(t);
Console.WriteLine (result);
}
static void CppGetString() {
IntPtr t = cpp_get_string();
String result = Marshal.PtrToStringAuto(t);
Console.WriteLine (result);
}
public static void Main (string[] args) {
CppPercent();
CppSetString();
CppGetString();
}
}
}