Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 5 
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

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);

        [DllImport("BoxOptimize-Library", CallingConvention = CallingConvention.Cdecl, EntryPoint = "?destruct_instance@@YAXPAVBox_Method@@@Z")]
        extern static public void destruct_instance(void *instance);

/* ... */
}


При этом структуры надо будет описать в коде на C# тоже. Но обычно все намного проще. Советую почитать вот тут:

http://msdn.microsoft.com/ru-ru/library ... spx?ppud=4

И еще, главный момент, который многие забывают-архитектура для собираемого .NET приложения должна быть указана принудительно, и должна соответствовать нативной библиотеке... Т.к. в противном случае при запуске приложения на 64-битной системе при попытке загрузить 32-битную DLL приложение вывалится с ошибкой.

_________________
14900KF@6000/4800 (p95 & Linpack)
96G Trident Z5 @ 7200 (34-42-42-53, ICE-RDT)
z790 Aorus Master X
RX 6900XT GAMING OC 16G+Bykski WB
macOS Sequia 15.5


 

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);
Файл библиотеки должен лежать по пути вызывающего проекта.

_________________
"Мы русские и званьем дорожим,
мы матом не ругаемся, мы матом - говорим" А. Алякин


 

Advanced member
Статус: Не в сети
Регистрация: 27.02.2007
Откуда: Москва
Фото: 54
Airhand писал(а):
Мне нужны были сами вызовы, а не обёртка над ними.

Гм, то есть дллки не было? ) А причем тут тогда C#, если это обычный сdecl. :roll:


Добавлено спустя 2 минуты 6 секунд:
P.S. Airhand, энтрипоинт указывать необязательно, если он совпадает с именем метода в обертке.

_________________
14900KF@6000/4800 (p95 & Linpack)
96G Trident Z5 @ 7200 (34-42-42-53, ICE-RDT)
z790 Aorus Master X
RX 6900XT GAMING OC 16G+Bykski WB
macOS Sequia 15.5


 

Member
Статус: Не в сети
Регистрация: 30.03.2006
Откуда: Из инета
HertZ писал(а):
Гм, то есть дллки не было? ) А причем тут тогда C#, если это обычный сdecl.

Ошибка была в длл, поэтому и не получалось. Всё дело в том, что я никогда не делал такое и поэтому не мог знать где ошибка.

HertZ писал(а):
P.S. Airhand, энтрипоинт указывать необязательно, если он совпадает с именем метода в обертке.

Благодарю, я этого не знал.

_________________
"Мы русские и званьем дорожим,
мы матом не ругаемся, мы матом - говорим" А. Алякин


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 5 
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan