Вызов кода C # из неуправляемого C ++? - PullRequest
1 голос
/ 16 марта 2012

В Mono вы можете передать делегат из C # в функцию C ++, которая принимает делегат в качестве указателя на функцию.Можно ли это сделать в C # в Windows, например, где вы можете скомпилировать собственную неуправляемую библиотеку C ++, связать ее с проектом C # и получить функцию C ++ для вызова функции C # через указатель функции, который C # передал ей в качестве делегата?

Ответы [ 5 ]

6 голосов
/ 16 марта 2012

Определите делегата в .NET, а затем передайте его своему неуправляемому коду.CLR представит делегата как указатель на функцию, которую вы можете вызвать из неуправляемого кода.

Уровень взаимодействия не знает, как обрабатывать ссылки в C ++.Так что вам нужно выставить объект как указатель, а не как ссылку.Кроме того, .NET не знает, что такое объект C ++ (это не то же самое, что System.Object).Это нужно будет передать как IntPtr, и я не думаю, что вы можете многое сделать с ним в .NET.

C ++ обратные вызовы:

typedef void (*CBFUNC1)(unsigned int, const char*, object&);
typedef object* (*CBFUNC2)(object*, struct _mystruct* );

C # подписи дляделегаты будут

delegate void CbFunc1(uint param1, [MarshalAs(UnmanagedType.LPStr)] string
param2, IntPtr param3);
delegate IntPtr CbFunc2(IntPtr param1, ref _mystruct param2);
1 голос
/ 15 октября 2014

Rohit ответ правильный, но есть много других ошибок на пути в зависимости от того, перезваниваете ли вы немедленно (C # вызывает C ++, который вызывает C #) или если вы хотите перезвонитьнесколько раз (C # вызывает C ++ и после возврата одного или нескольких раз перезвонит C #).

я написал этот пример с точки зрения Unity / C # и C / C ++ / Objective-Cвзаимодействия, но вы можете найти некоторые комментарии и фрагменты кода полезными, независимо от того, где вы выполняете взаимодействие C # / C.

в частности, убедитесь, что вы правильно сохраняете / удерживаете любые делегаты, которые вы передаете из C #/ удалось C / неуправляемый код, если неуправляемый код C / может перезванивать в другое время.

1 голос
/ 16 марта 2012
1 голос
/ 16 марта 2012

Это, очевидно, можно сделать - все хосты CLR являются начальными приложениями. Ваши варианты:

  • в управляемом приложении вызовите вашу собственную DLL (PInvoke)
  • вызов управляемого COM-объекта (как предложил Дан)
  • хост CLR самостоятельно - образец
1 голос
/ 16 марта 2012

Одна из ваших возможностей - использовать C ++ / CLI для вызова кода C #. Если ваш код C ++ должен оставаться неуправляемым (нативным), то вы должны обернуть свой код C # в компонент COM и использовать его из своего кода C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...