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