LINUX.ORG.RU

C# и вызов функций cpp-библиотеки

 , ,


0

1

Пытаюсь на 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();
		}
	}
}


Как сказал gv: man strcpy.

char *strcpy(char *dest, const char *src);
The strings may not overlap, and the destination string dest
must be large enough to receive the copy.

blinkenlichten ()

Для strcpy под целевую строку должна быть уже выделена память

vertexua ★★★☆☆ ()
Ответ на: комментарий от vertexua

Для strcpy под целевую строку должна быть уже выделена память

Ага, я потом понял, так написал:

//Отдача строки из C++
extern "C" DLL_PUBLIC char* cpp_get_string () {
string ss = "Пытаюсь на C# написать вызов функций из библиотеки на C++. Функции строковые и числовые. Если вызывать только один ну из функций, то все нормально, а если все сразу (как в исходниках снизу) то крешится. Не могу понять в чем ошибки — помогите :]";//"Я строка из C++";
char* c = new char[ss.length()];
strcpy(c,ss.c_str());
return c;
}

makeB ()
Ответ на: комментарий от makeB

при выделении памяти под строку нужно учитывать и завершающий символ '\0' char* c = new char[ss.length()+1];

anonymous ()
Ответ на: комментарий от makeB

В функции char* cpp_set_string (const char* ss) тоже самое, сначала нужно выделить память: char* c = new char[strlen(ss)+1];

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.