2012-03-16 5 views
0

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

+0

Это должно быть возможно, поскольку мы можем взаимодействовать между C# и C++. http://stackoverflow.com/q/2470487/1155650 проверьте это. возможно, то, что вы ищете –

ответ

5

Определите делегат в .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); 
+0

И это будет работать там, где C++ не нужно управлять? – tweetypi

+0

Да даже с неуправляемым C++ только для того, чтобы у вас были ваши собственные метаданные для сортировки –

1

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

1

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

  • в управляемом приложении обратитесь к родному DLL (PInvoke)
  • вызова управляемого COM-объект (как это было предложено Dan)
  • хоста CLR самостоятельно - sample
1

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

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

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

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