Как реализовать постоянные обратные вызовы с C++ на C#?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как реализовать постоянные обратные вызовы с C++ на C#?

Сообщение Anonymous »

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

Код: Выделить всё

namespace omk_api
{
enum LogSeverity : int
{
Error = 1,
Warning = 2,
Info = 3,
Trace = 4
};

typedef void(__stdcall* logProc)(const wchar_t* source, const wchar_t* message, LogSeverity severity);
}
Экспорт функций C++

Код: Выделить всё

extern "C" __declspec(dllexport) void* __stdcall CreateController(omk_api::logProc log)
{
return (void*)(new omk_controller::Controller(log));
}
Соответствующий код C#

Код: Выделить всё

    public class Controller : IDisposable
{
private IntPtr instance;
private LogProc logProc;

[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate void LogProc([MarshalAs(UnmanagedType.LPWStr)] string source,
[MarshalAs(UnmanagedType.LPWStr)] string message,
LogSeverity severity);

// (...)

[DllImport("OpenMacroKeyboard.Controller.dll")]
private static extern IntPtr CreateController(LogProc log);

// (...)

private void Log(string source, string message, LogSeverity severity)
{

}

// Public methods -----------------------------------------------------

public Controller()
{
logProc = new LogProc(Log);
instance = CreateController(logProc);
}

// (...)
}
Мой вопрос: нужно ли мне выполнять какие-либо дополнительные операции, чтобы быть уверенным, что указатель, переданный в C++, останется неизменным (чтобы не было странных сбоев, вызванных сборщиком мусора) передвигать вещи)? Время жизни объектов C++ будет равно времени жизни их оболочек C#, поэтому меня не беспокоит фактическая сборка мусора.


Подробнее здесь: https://stackoverflow.com/questions/781 ... rom-c-to-c
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»