Выделение объекта класса ref в неуправляемой куче - PullRequest
0 голосов
/ 18 мая 2011

Если я определяю новый ref class в C ++ / CLI, могу ли я затем использовать этот тип в качестве стандартного неуправляемого класса, и если да, то вообще ли ключевое слово ref изменяет макет памяти типа данных?

В моем случае, есть класс, который используется повсеместно в очень очень большом приложении C ++.Мы назовем это MyExampleThing:

class MyExampleThing
{
    int a = 0;
    int b = 1;
}

Мы рассматриваем возможность медленной интеграции большего числа компонентов .net framework в это приложение через C ++ / CLI.Если я перенесу этот класс на ref class, продолжит ли он (при нормальных обстоятельствах) работать в другом старом неуправляемом коде C ++?Или я должен был бы оставить все как есть и написать ref class оболочку для обработки .net interop?

Для ясности: я знаю, что не могу просто передать неуправляемый указатель в управляемый код, я просто спрашиваю, могу ли я использовать класс отдельно как либо управляемый или неуправляемый.

То же самое верно для value class?

Также важно: если я могу создать ref class es в неуправляемой куче, будет ли структура памяти такой же, как если бы это был обычный C ++учебный класс?(Неуправляемые версии этого класса сериализуются байт за байтом в виде двоичных данных. Да, я знаю о проблемах с порядком байтов при такой обработке, нет, я не принял это решение.)

Ответы [ 2 ]

1 голос
/ 18 мая 2011

ref - это не ключевое слово, с которым я знаком, поэтому я собираюсь выйти на конечность и сказать, что оно, вероятно, не поддерживается неуправляемым C ++

Если у вас есть повторно используемые классы для библиотеки, япросто сделает их в неуправляемом C ++, который можно легко импортировать и использовать в управляемом коде, а ваши компоненты .NET и управляемый код будут разделены.Предпочитайте разъединенные классы и интерфейсы объектам, которые делают все, что угодно, когда это возможно.

Вы также можете создавать оболочки, которые объединяют управляемый и неуправляемый код, когда вам нужно, чтобы одна сторона взаимодействовала с другой.Мой опыт ограничен тем, чтобы приложение на C # вызывало библиотеку C ++, я однажды экспериментировал с CLI, но сам не нашел это особенно полезным.

0 голосов
/ 26 мая 2011

Можно написать DLL смешанного режима для управляемых и собственных клиентов.Взгляните сюда http://msdn.microsoft.com/en-us/magazine/cc300632.aspx.

Лично я всегда заканчивал тем, что писал оболочку в C ++ / CLI для предоставления классов C ++ для C #.

...