Это может работать, только если JobData является структурой. Вы мертвы в воде, если это класс, вы не можете создать экземпляр класса C ++ в C #. У вас нет доступа к конструктору и деструктору.
Ключевое слово "const" - это атрибут, проверяемый компилятором C ++, он не имеет отношения к коду C #. Ссылка на C ++ - это указатель под капотом, вы получите его, объявив аргумент "ref". Вероятно, у вас возникнут проблемы с правильным отображением имени экспорта «ShowJob», которое обычно оформляется компилятором C ++. Вы бы подавили это оформление, добавив префикс функции к внешнему «C» в коде C ++. Если вы не можете изменить код C ++, вы можете найти экспортированное имя, запустив Dumpbin.exe / exports в DLL.
Сложив все это вместе, объявления должны выглядеть примерно так:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
private struct JobData {
// members...
}
[DllImport("something.dll", EntryPoint = "?ShowJob@@YAHABUJobData@@@Z", CallingConvention = CallingConvention.Cdecl)]
private static extern int ShowJob(ref JobData data);
Здесь идет много предположений, вам нужно проверить это с помощью вашего реального кода на C ++. Если аргумент JobData на самом деле является классом, то вам нужно написать оболочку класса ref на языке C ++ / CLI.