2010-05-20 3 views

ответ

1

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

+0

Отлично, спасибо. Основной недостающей частью было то, что ссылка C++ является указателем под капотом. У вас есть ссылка на страницу документации, которая прямо говорит об этом? – splintor

+0

Внутренние компоненты компилятора никогда не документируются, они имеют обратную конструкцию. –

2

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

[DLLImport(DLLName)] 
public static extern int ShowJob(ref JobData data);