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();
		}
	}
}



Последнее исправление: makeB (всего исправлений: 1)

Как сказал 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
()
Ответ на: комментарий от 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
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.