2013-08-28 1 views
-1

Я очень новичок в C++, поэтому у меня могут быть некоторые ошибки на этой стороне. Так что я начал с написанием простой функции C++, которая будет содержать-структуру в качестве типа возвращаемого значения:передайте функцию C++, которая содержит struct to C# и преобразует ее в C# -функцию с Marshal.PtrToStructure

моего C++ структура:

struct a { 
    int i; 
}; 

моего C++ функция объявление в library.h файл:

extern "C" __declspec(dllexport) struct a retNumber(); 

моего Описание функции C++ в файле library.cpp:

struct a retNumber() 
{ 
    struct a r = a(); 
    r.i = 22; 
    return r; 
} 

Я просто хочу, чтобы скомпилировать его, а затем использовать его в C# код, я получаю следующие ошибки компиляции:

error C2371: 'retNumber' : redefinition; different basic types 
error C2526: 'retNumber' : C linkage function cannot return C++ class 
error C2556: 'a retNumber(void)' : overloaded function differs only by return type from 'void retNumber(void)' 

Это первая часть моего вопроса, и если вы, ребята, поможете мне решить, я действительно ценю это после того, как он решил, что я собираюсь объявить же структуру в моих C# код:

struct a1 
{ 
    int i; 
} 

Тогда я буду импортировать мои C++ функции:

[DllImport("library.dll")] 
public static extern a1 retNumber(); 

После того, как это сделано, я создам GCHand ль:

a1 test = retNumber(); 
GCHandle handle = GCHandle.Alloc(test, GCHandleType.Pinned); 

, а затем я буду стараться, чтобы преобразовать мой фактический результат и освободить память:

 Object temp = Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(a1)); 
     handle.Free(); 

Так к этому времени я должен иметь объект, который имеет типа a1 и содержит переменный я со значением 22

Если кто-то может порадовать этот процесс, я буду очень благодарен! Спасибо вам большое заблаговременно !!!

+0

Я действительно предлагаю, чтобы у вас было 2 вопроса, которые вы задаете им обоим по отдельности. –

+0

они надежны друг на друга, а люди C++ смогут увидеть, что я ищу – inside

ответ

1

На стороне C++, вам нужно обернуть все в extern "C", в том числе структуры:

extern "C" { 
    struct a { 
     int i; 
    }; 
}; 

На C# стороне, вам необходимо указать соглашение о вызовах правильно:

[DllImport("library.dll", CallingConvention=CallingConvention.Cdecl))] 
public static extern a1 retNumber(); 

Как только вы это сделаете, нет необходимости в вызове Marshal.PtrToStructure. Просто выполните:

a1 test = retNumber(); 
Console.WriteLine(a1.i); // Should print 22 
+0

Спасибо за ответ Рид, если вы можете вкратце объяснить, в каких случаях мне нужно использовать Marshal.PtrToStructure, было бы здорово, спасибо – inside

+0

Хорошо, поэтому я завернул структуру, однако компилятор все еще жалуется на мою функцию: struct a retNumber() { struct ar = a(); r.i = 22; return r; } – inside

+0

@Stanislav Какая ошибка сейчас? –