Нет, это не поможет. В C++/CLI также различается собственная структура (ключевое слово struct
) и управляемая структура (ключевое слово value struct
). Вы можете, конечно, объявить структуру, используя #include, чтобы вы всегда использовали объявление C, вы даже можете заставить ее экспортировать структуру в метаданные с помощью #pragma make_public
. Но компилятор C# просто увидит непрозрачный тип значения без каких-либо членов.
CLR прилагает много усилий, чтобы сделать компоновку структуры идентичной исходной компоновке, которую использует компилятор C или C++. Важно сделать interop эффективным, он делает структуру blittable. Но используемые ею правила совершенно преднамеренно не документированы и фактически зависят от конкретных типов членов структуры и битовности процесса. В неясных случаях это будет выгодно [StructLayout (LayoutKind.Auto)]. Вы можете найти пример такой неудачи here.
Предложение «иногда не» - это трюк, компилятор ничего не может предположить о макете. Вы все равно можете заставить C++/CLI окупиться своей способностью анализировать объявление структуры C с помощью #include. Это помогает избежать несчастных случаев либо путем неправильного объявления декларации управляемой структуры, либо при изменении кода C. Вам нужно объявить управляемую версию с ключевым словом public value struct
, чтобы ваш код C# использовал его. Вы сомневаетесь, что это будет стоить дополнительного проекта, но, вероятно, это не так.
Тот же файл буквального кода, используемый в обоих проектах? Нет. Вы могли бы сделать это с третьим общим проектом и большим количеством конструкций '#ifdef .. # endif'. – Blindy
У меня есть файл заголовка службы. Не могли бы вы объяснить, что вы имеете в виду, потому что я не понимаю. – Yanshof
Вы делаете третий проект C++ между C# one и C++. Ваш заголовочный файл, находящийся в C++, должен быть скомпилирован в проекте C++ (неуправляемый для вашего исходного проекта и управляемый заглушка с только заголовком, на который ссылается проект C#). Вам нужно внести изменения условной компиляции ('ref class' vs' class' и т. Д.), Но тот же заголовочный файл * может * работать для обоих. – Blindy