2014-10-22 3 views
1

У меня есть DLL поставщика, предназначенная для вызова из C++, но мне нужно вызвать ее из C#.Как вызвать методы из библиотеки C++ в C#

Используя приложение под названием PE Explorer можно увидеть список экспортируемых методов в DLL (назовем его Protocol.dll сейчас) и даже получить «недекорированного C++ Функция» подпись так:

public: unsigned int __thiscall Myco::Protocol::tMultiThingClient::GetThings(char (* const)[16],unsigned int) 

Как использовать что-то подобное на C#? Я знаю, что я использую DllImport, я просто не знаю, как перейти от подписи выше к соответствующей подписи DllImport.

Всего WAG:

[DllImport("Protocol.dll", EntryPoint="GetThings")] 
public static extern void GetThings(ref string[], uint); 

Это даже близко? Есть ли где-нибудь ссылка, которая переводит между объявлениями C++, такими как char (* const)[16] и их эквивалентами C#?

+0

Этот вопрос задается еженедельно на SO. Если вы вызываете функцию члена C++, вы должны использовать CallingConvention.ThisCall. Однако каждый раз, когда кто-то спрашивает об этом на SO, ответ всегда «не делайте этого, пишите обертку C++/CLI». Это намного проще. –

+2

http://www.mono-project.com/docs/advanced/pinvoke/, вероятно, лучшая доступная информация, если вы не хотите писать свою собственную обертку. – BlamKiwi

ответ

1

Вам необходимо создать отдельный проект, содержащий смешанную сборку с использованием C++ CLI. Для этого вам нужно включить переключатель компилятора CLR в свойствах проекта. Поскольку проект позволяет смешанную сборку, вы можете вызвать функцию C++, а также создать интерфейс C# для вашей основной программы для вызова.

Итак, ваша основная программа вызовет интерфейс, который вы реализуете в своем проекте C++ CLI, который, в свою очередь, вызовет функцию C++ в DLL.

Будьте осторожны с Marshalling and Thunking, пока вы это делаете, если это относится к вашим системным соображениям.

+0

Я не рекомендую использовать смешанную сборку (semms очень уродливый для меня), если можно решить проблему с правильной сортировкой. – joe

+1

@joe Откуда это будет? –

+0

@DavidHeffernan, вы знаете хороший учебник или пройти через это? Маршрут CLI C++ кажется немного сложным для newbees. –

Смежные вопросы