Предположим, что это C-структуры в файле с именем structs.h
struct StructB
{
int bMember1;
int bMember2;
int* bMember3;
};
struct StructA
{
struct StructB aMember1;
};
В новом проекте DLL VC ++ включите поддержку Common Language RunTime (старый синтаксис) и убедитесь, что исключения C ++ отключены. Постройте это для цели выпуска.
extern "C"
{
#include "structs.h"
}
namespace Wrapper
{
public __gc class NewStructB
{
private:
StructB b;
public:
NewStructB()
{
}
~NewStructB()
{
}
int getBMember1()
{
return b.bMember1;
}
void setBMember1(int value)
{
b.bMember1 = value;
}
int getBMember2()
{
return b.bMember2;
}
void setBMember2(int value)
{
b.bMember2 = value;
}
int* getBMember3()
{
return b.bMember3;
}
void setBMember3(int* value)
{
b.bMember3 = value;
}
};
public __gc class NewStructA
{
public:
NewStructB* b;
NewStructA()
{
b = new NewStructB();
}
~NewStructA()
{
delete b;
}
void ShowInfo()
{
System::Console::WriteLine(b->getBMember1().ToString());
System::Console::WriteLine(b->getBMember2().ToString());
System::Console::WriteLine((*b->getBMember3()).ToString());
}
};
};
Затем создайте новое консольное приложение C # и создайте ссылку на файл .dll, который мы только что создали. В разделе «Свойства проекта»> «Построить» установите флажок «Разрешить небезопасный код».
static void Main(string[] args)
{
int toBePointed = 12345;
Wrapper.NewStructA a = new Wrapper.NewStructA();
a.b.setBMember1(10);
a.b.setBMember2(20);
unsafe
{
a.b.setBMember3(&toBePointed);
}
a.ShowInfo();
Console.ReadKey();
}
Как видите, оригинальная StructA в некотором роде устранена !! И я не знаю другого способа получить доступ к членам структуры C напрямую из C # из-за проблем с доступом.