Влияет ли настройка «Обрабатывать wchar_t как встроенный тип» на «Нет» на взаимодействие с C #? - PullRequest
0 голосов
/ 14 марта 2012

У меня есть приложение на C #, использующее C ++ DLL.Это работало нормально, но теперь мне нужно изменить «Обрабатывать wchar_t как встроенный тип» с «Да (/ Zc: wchar_t)» на «Нет (/ Zc: wchar_t-)», и мое приложение на C # стало очень нестабильным.Уровень взаимодействия между C ++ и C # включает некоторые строки в качестве параметров функции и в таких структурах, как это:

C ++:

typedef struct
{
    // Used to be: WCHAR wstrName[256];
    wchar_t wstrName[256];
} sdevicemodel_t;

C #:

namespace Thingy
{
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct DeviceModel
    {
        // info
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
        public string Name;
    }
}

Нужно ли мнеизменить это объявление, чтобы оно соответствовало изменению в C ++, или это нормально, и моя проблема в другом месте?

Спасибо за любую помощь.

1 Ответ

3 голосов
/ 14 марта 2012

Краткий ответ: нет, это никак не влияет на Interop.

Эта опция говорит компилятору обрабатывать тип wchar_t C ++ как встроенный тип вместо * 1004.* из unsigned short.Это требуется (не так) последними версиями языка C ++, но более старые версии компиляторов MS C ++ делали это неправильно.

Так что теперь у вас есть два варианта: стандарт C ++:(The Right Way ™) и способ обратной совместимости (The MS Way ™).

Но это различие (встроенный тип по сравнению с типом typedef) имеет значение только тогда, когда вы выполняете перегрузки функций, специализации шаблонов илиподобное, аналогичное, похожее.Взаимодействие C # касается только двоичной совместимости, и эта опция не изменяется (wchar_t в обоих случаях является 16-разрядным целым числом без знака).

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