Если вы хотите отделить свою бизнес-логику от пользовательского интерфейса, а некоторая часть вашей бизнес-логики находится в собственном коде, то было бы неплохо не изменить любое содержимое графического интерфейса из нативный код напрямую, потому что он в точности противоположен тому, чего вы хотите достичь. Лучше попытаться написать какой-нибудь метод-обертку в C ++ / CLI, чтобы вызвать оттуда подпрограмму собственного формата данных, сделав ее доступной для использования в коде GUI.
Если вы действительно хотите выполнять вызовы из собственного кода в управляемый код, вы можете объявить (собственный!) Статический метод в C ++ / CLI, который вызывает управляемый метод. Вы можете передать указатель функции на такой метод на нижний уровень вашей программы (например, на ваш родной уровень C ++), который может быть вызван оттуда.
Что-то вроде:
// the native code layer:
// "Callbacks.h"
void (*_myNativeCallback)();
void InitCallback(void (*myNativeCallback)())
{
_myNativeCallback=myNativeCallback;
}
// now you can use _myNativeCallback within your native code
// the C++/CLI layer:
#include "Callbacks.h"
//...
static void MyNativeCallback()
{
ManagedClass::StaticMethod();
}
InitCallback(MyNativeCallback);
В ManagedClass::StaticMethod
у вас есть доступ к вашему .NET-коду, и у вас не должно быть проблем с манипулированием TextBox
любой формы, которую вы можете получить оттуда. Если вам нужно преобразовать нативную строку в System::String
, этот фрагмент кода может оказаться полезным:
inline System::String StdToSysString(const std::string &s)
{
return gcnew System::String(s.c_str());
}
И наоборот (предполагается, что кодовая страница Ansi):
inline std::string SystemToStdString(System::String ss)
{
using namespace System::Runtime::InteropServices;
const char* chars =
(const char*)(Marshal::StringToHGlobalAnsi(ss)).ToPointer();
std::string s = chars;
Marshal::FreeHGlobal(System::IntPtr((void*)chars));
return s;
}