преобразовать дескриптор структуры из управляемого в неуправляемый C ++ / CLI - PullRequest
4 голосов
/ 23 марта 2012

В C # я определил структуру:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct MyObject
{
   [MarshalAs(UnmanagedType.LPWStr)]
   public string var1;    

   [MarshalAs(UnmanagedType.LPWStr)]
   public string  var2;    
};

У меня есть эта структура в C ++:

public value struct MyObject
{
    LPWSTR var1;    
    LPWSTR var2;    
};

И в методе C ++, который является публичным классом, который нужно вызыватьиз C #:

TestingObject(MyObject^ configObject)
{
   // convert configObject from managed to unmanaged.
}

Объект отлажен правильно, что я вижу две строки var1 и var2.Однако теперь проблема в том, что мне нужно преобразовать объект: configObject в неуправляемый объект.

Я думаю о том, чтобы сделать что-то вроде этого:

TestingObject(MyObject^ configObject)
{
   // convert configObject from managed to unmanaged.
   MyObject unmanagedObj = (MyObject)Marshal::PtrToStructure(configObject, MyObject);  
}

То естьо чем я могу думать, но, конечно, я получил эту ошибку:

Ошибка 2 ошибка C2275: «MyObject»: незаконное использование этого типа в качестве выражения

Isэто право преобразовать управляемый объект в неуправляемый объект?Если так, как я могу это правильно Marshal::PtrToStructure?Если нет, как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

Marshal::PtrToStructure делает противоположное тому, что вы хотите, он преобразует неуправляемый указатель на управляемый объект. Вы хотите Marshal::StructureToPtr.

Кроме того, вам необходимо определить неуправляемый класс, поскольку MyObject является управляемым типом. Предполагая, что вы сделали это, вы могли бы сделать это так (просто преобразовали это из образца C #):

IntPtr pnt = Marshal::AllocHGlobal(Marshal::SizeOf(configObject)); 
Marshal.StructureToPtr(configObject, pnt, false);

Затем у вас есть указатель на данные, которые вы можете memcpy или что-то еще в вашей собственной структуре.

Но MyObject есть и останется управляемым типом. Если вы хотите действительно неуправляемый тип, вы должны определить тот, который соответствует управляемой структуре.

Просто интересно, почему вы используете неуправляемый LPWSTR в управляемой структуре?

1 голос
/ 23 марта 2012

Вы, вероятно, имеете в виду:

struct MyUnmanagedStruct {
    LPWSTR var1, var2;
};

Тогда вы можете использовать Marshal.StructureToPtr, как предложено Botz3000. В противном случае C #

public struct MyObject {
   public String var1;
   public String var2;
}

и C ++ / CLI

public struct value MyObject {
   public String^ var1;
   public String^ var2;
}

полностью эквивалентны, при условии, что вы используете одинаковый System.String с обеих сторон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...