Member
Статус: Не в сети Регистрация: 30.03.2006 Откуда: Из инета
Другими словами нужно: из c# вызывать функции, написанные на c++ и содержащиеся в dll. Так называемый маршалинг. Кто знает как, опишите пожалуйста кокой код нужен на с++ и с#.
_________________ "Мы русские и званьем дорожим, мы матом не ругаемся, мы матом - говорим" А. Алякин
Advanced member
Статус: Не в сети Регистрация: 27.02.2007 Откуда: Москва Фото: 54
Airhand Все просто. В .NET-проекте создаешь класс-обертку для нативного кода, и определяешь в нем прототипы для методов с директивой DllImport с именем библиотеки в качестве параметра. Если требуется, то также указываешь тип соглашения вызовов и имя импортируемой функции. В самом запущенном случае (если C-функции в параметрах используют указатели на структуры, например) это может выглядеть вот так:
Код:
unsafe class BoxOptimizeNative { [DllImport("BoxOptimize-Library", CallingConvention = CallingConvention.Cdecl, EntryPoint = "?create_blank_instance@@YAPAVBox_Method@@XZ")] extern static public void* create_blank_instance();
[DllImport("BoxOptimize-Library", CallingConvention = CallingConvention.Cdecl, EntryPoint = "?create_instance@@YAPAVBox_Method@@PAU_Vector@@000@Z")] extern static public void* create_instance(V* A, V* U, V* L, V* K);
И еще, главный момент, который многие забывают-архитектура для собираемого .NET приложения должна быть указана принудительно, и должна соответствовать нативной библиотеке... Т.к. в противном случае при запуске приложения на 64-битной системе при попытке загрузить 32-битную DLL приложение вывалится с ошибкой.
Member
Статус: Не в сети Регистрация: 30.03.2006 Откуда: Из инета
HertZ Неверно поняли. Мне нужны были сами вызовы, а не обёртка над ними. Я уже сделал, но всё равно благодарю. Вот как у меня получилось (может кому-нибудь понадобится): в самой библиотеке (в cpp файле): __declspec(dllexport) void <имя функции>(int a, double d) { <тело функции> } В заголовке библиотеки: EXTERN_C __declspec(dllexport) void <имя функции>(int a, double d); В C# проекте: [DllImport("<имя файла>.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, EntryPoint = "<имя функции>")] private extern static void <имя функции>(int a, double d); Потом можно вызывать её в коде как обычно: <имя функции>(7, 3.28); Файл библиотеки должен лежать по пути вызывающего проекта.
_________________ "Мы русские и званьем дорожим, мы матом не ругаемся, мы матом - говорим" А. Алякин
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения