私のアプリケーションは、C# (マネージ コード) と C++ (アンマネージ コード) の 2 つの部分に分かれています。両方の部分が互いに頻繁に呼び出しを行い、通常はそれらの間で文字列を渡します。それを行うための最良でエラーのない方法を知りたいです。
私は問題を二つの部分に分けた
Managed から Unmanaged コードを呼び出す場合、String Builder を使用して Managed から Unmanaged に渡します。
[DllImport("SomeXYZ.dll")] // enter code here private void XYZ(string text) { StringBuilder builder = new StringBuilder(); builder.Append(“Var1”); FromManagedtoUnmanaged(builder); }
C++ コード:
extern "C" { int _declspec(dllexport) FromManagedtoUnmanaged(char* var1); }
Unmanaged から Managed まで、関数ポインターを使用して、c# 関数の関数参照を c++ 関数に渡します。
C# コード
[DllImport("SomeXYZ.dll")] public static extern void SetCallback(Callback fn); public delegate void Callback(string text); public Callback mInstance; private void ABC(string text) { mInstance = new Callback(SomeFunctionName); SetCallback(mInstance); }
ヘッダー ファイル内の C++ コード:
extern "C" { void __declspec(dllexport) __stdcall SetCallback(Callback handler); void __declspec(dllexport) __stdcall SendReceiveMessage(char* arr1); }
そして .cpp ファイルで:
void __stdcall SetCallback(Callback handler1) { Handler = handler1; } void __stdcall SendReceiveMessage(char* arr1) { Handler(arr1); } void SendMsg(int SomeVar) { char *str; str = new char[1024]; sprintf(str, “<body>%d</body>”, SomeVar); SendReceiveMessage(str); }