Я создаю плагин для существующего программного обеспечения с использованием C ++ / CLI (для основного ядра) и C# WPF (для пользовательского интерфейса). Я пытаюсь следующий поток:
Init C# -WPF из C ++ / CLI (MainCore) и открыть интерфейс пользователя (WPF):
void BCFConsumer::ShowUI() {
CSMainWindow^ UI = gcnew CSMainWindow();
UI->Show();
}
В интерфейсе пользователя I ' вызов функции C ++ / CLI для события Button_Click:
public void Select_Click(object sender, RoutedEventArgs e)
{
SelectElements();
}
Функция C ++ / CLI - SelectElements () - импортируется в интерфейс пользователя (C#) с помощью:
[DllImport("BCF.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "?StartObjectSelect@BCFConsumer@@SAXXZ")]
public static extern void SelectElements();
Функция SelectElements () выглядит и экспортируется из C ++ / CLI:
__declspec(dllexport) void __cdecl BCFConsumer::StartObjectSelect()
{
// switch to selection mode
m_InputMode = MODE_SELECT;
// set IFW to selection mode
::SendInteractorMessage(FM_INPUTFUNCTION_SET, new CObjectSelectGeneral(_T("Select symbols(s)"), SEL_ALL, true, false));
}
Пользовательский интерфейс загружается хорошо, ButtonClick заканчивается в C ++ / CLI функцией StartObjectSelect (), поэтому пока все хорошо.
Моя проблема - это исключение, если я вызываю функцию StartObjectSele c () (C ++ / CLI) из интерфейса пользователя (C#). Если я вызываю функцию StartObjectSele c () (C ++ / CLI) из кода C ++ / CLI (например, из конструктора), она работает нормально. Исключение, которое бросается, говорит:
"Попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена."
Я думаю, что это имеет что-то делать с потоками, Dispatcher, beginInvoke et c.