Я работаю над переносом некоторого кода на C++ в управляемый .NET. Мне нужно будет сохранить код C++ в родной форме и попытаться использовать подход IJW к нему. Я знаю, что можно объявить неуправляемую структуру, чтобы она корректно была привязана к .NET-коду, но компилятор C++, похоже, не делает этого.IJW: управляемая прокси-структура?
Например, у меня есть этот код (управляемый):
struct MyStruct
{
int some_int;
long some_long;
};
public ref class Class1
{
static MyStruct GetMyStruct()
{
MyStruct x = { 1, 1 };
return x;
}
};
Она компилирует, но когда я смотрю на это с помощью отражателя, код выглядит следующим образом:
public class Class1
{
// Methods
private static unsafe MyStruct GetMyStruct()
{
MyStruct x;
*((int*) &x) = 1;
*((int*) (&x + 4)) = 1;
return x;
}
}
[StructLayout(LayoutKind.Sequential, Size=8), NativeCppClass,
MiscellaneousBits(0x41), DebugInfoInPDB]
internal struct
{
}
В принципе, нет полей в MyStruct видны .NET. Есть ли способ сказать компилятору C++ для генерации?
При ответе на вопрос, пожалуйста, обратите внимание на это: Я знаю, как создать управляемый класс, который может быть видимым для .NET framework. Я НЕ заинтересован в этом. То, что я хочу для C++ компилятор объявить неуправляемый-структуру таким образом, что .NET поймет это, что-то вроде:
[StructLayout(LayoutKind::Sequential, blablabla ...)]
struct MyStruct
{
[MarshalAs ....... ]
System::Int32 some_int;
[MarshalAs ....... ]
System::Int32 some_long;
};
Да, но это делает структуру управляемой. Речь идет, в частности, о доступе к членам родных структур на C#. – Derrick
@Derrick - Хммм ... мне это было не совсем понятно, так или иначе, я обновил свой ответ. –
Спасибо. Я так делаю сейчас. Используя пакет из 1 с обеих сторон, вы получаете одинаковые макеты памяти, что позволяет мне получить указатель на неименованную структуру C++/CLI и передать ее структуре C#. Позор здесь, и я думаю, что автор вопроса пытался понять, что существует дублирование кода, что приводит к проблемам с ремонтопригодностью. Вы также можете объявить структуру дважды в C++ как управляемую и неуправляемую версию и сделать кастинг там, который по крайней мере уберет вас от небезопасных блоков на C#. Я думаю, что некоторая форма генерации кода может быть единственным решением. – Derrick