Как вызвать функцию C ++, которая берет ссылку из кода C # - PullRequest
1 голос
/ 20 мая 2010

HI, У меня есть функция C ++, как показано ниже:

int ShowJob(const JobData& data);

Как это переводится в оператор DLLImport, который я могу использовать для вызова функции из C #?

Ответы [ 2 ]

2 голосов
/ 20 мая 2010

Я предполагаю, что он ведет себя как указатель под капотом, поэтому относитесь к нему как к такому. По иронии судьбы, это делается путем объявления его в качестве параметра reference .

[DLLImport(DLLName)]
public static extern int ShowJob(ref JobData data);
1 голос
/ 20 мая 2010

Это может работать, только если 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.

...