내 응용 프로그램은 C# (관리 코드)과 C++ (비 관리 코드)의 두 부분으로 나뉩니다. 두 부분은 서로를 자주 호출하며 대개 두 요소 사이에 문자열을 전달합니다. 나는 그것을하기에 가장 좋고 오류가없는 방법을 알고 싶다. 관리되지 않는 코드에 관리에서 전화, 내가 관리되지 않는 관리에서 문자열 작성기를 전달하는 데 사용하고 때 관리 코드와 비 관리 코드 간 호출
나는 두 부분에 문제를 나누어 :
[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); }
비 관리 대상에서 관리 대상으로, giv 함수 포인터를 사용하고 있습니다. 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); }
정확한 질문은 무엇입니까? 파트 2는 어디에 있습니까? 내가 볼 수있는 한'StringBuilder'를 사용하지 않고'string'을 사용합니다. –
@ZdeslavVojkovic 'FromManagedtoUnmanaged'의 구현에서 그는 보통 StringBuilder를 함수에 전달하지 않는다고 생각합니다. –
저는 그렇게 생각하지 않습니다. 그것은 관리되지 않기 때문에'StringBuilder'를 사용할 수 없습니다. interop의 경우,'StringBuilder'는 대개 문자열이 불변이므로 문자열의 상태를 변경하는 함수로 보내집니다. –