Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> C++ Interop 
:(
    Опции темы
KuMa1104
Дата 28.4.2011, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: нет
Всего: 3



Здравствуйте Все!
Я хочу из С++ unmanaged Вызвать Callback ф-ию представленную C# делегатом
Код

public delegate void ChangeDelegate(int S);
    class PlatformInvokeTest
    {
        [DllImport("tt.dll")]
        public static extern void TestFunc([MarshalAs(UnmanagedType.FunctionPtr)]ChangeDelegate d); //Её!!!

        public static void Main()
        {
            TestFunc(new ChangeDelegate(OnChange));    //вызываю ф-ию из С++ библиотеки
        }

        public static void OnChange(int S)
        {
            Console.WriteLine(S); // Сюда возврашаеться из С++ результат
        }

    }

Вот функция 
.h
Код

extern "C" {
    __declspec(dllexport) void __cdecl TestFunc (void (* F_df)(int));
};

.cpp
Код

#include "stdafx.h"
#include "Func.h"
extern void __cdecl TestFunc (void (* F_df)(int)) {

    F_df(9);
}


Проблема в том что после  того как происходит в С++ вызов F_df(9);
Вызов попадает в C# метод OnChange(int S) а когда выходит из него у меня выскакивает исключение

user posted image

что не так? 
В нете пишут что не верна определена сигнатура. Вот только где?????





--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
Fortnox
Дата 29.4.2011, 00:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 31.10.2008
Где: Ростов-на-Дону

Репутация: 14
Всего: 22



Вам нужно изменить формат вызова функций в библиотеке на __stdcall, в свойствах проекта тоже.

Суть в том, что делегаты в C#, по-умолчанию используют формат __stdcall, и указать другой формат, вы не можете. Это ограничение языка.см. ниже
Подробнее можно почитать тут:
1
2

Добавлено @ 00:39
Во, по первой ссылке есть простое решение, добавить атрибут формата вызова делегата:
Код

[UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]
public delegate void ChangeDelegate(int S);

и не надо будет менять формат вызова функций в библиотеке C++.

Это сообщение отредактировал(а) Fortnox - 29.4.2011, 00:40
PM MAIL   Вверх
KuMa1104
Дата 29.4.2011, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: нет
Всего: 3



Спасибо. Разобрался, помогло!+



--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0515 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.