托管代码和非托管代码之间的调用代码
我的应用程序分为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#函数的EA函数参照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); }
最好的是创建一个轻的C++/CLI程序集 两者之间。这是什么/为什么这种语言已被创建。
这个C++/CLI层将无缝集成到您的C#项目中,可以像任何.net资源那样访问,并且C++/CLI可以无缝地调用任何本机C++代码。
我已经停止将C++直接调用到C#代码中,因为我已经尝试了这种技术。
如果您从未听说过C++/CLI,here's a concise tutorial in pdf format。
好吧,它只是在写入时没有错误,并且引入了另一个程序集来调用一个使部署稍微复杂的方法。 – 2013-03-04 15:47:27
@ZdeslavVojkovic没错。我已经相应编辑了。然而,根据我的经验,**它很容易在错误的函数名称**中出错,对于初学者甚至非初学者程序员来说,这是完全不可读的...... C++/CLI已经完全赢得了游戏的胜利对我来说。 – 2013-03-04 15:53:52
对于普通的C函数,名称修改不是一个问题,但我同意选择正确的参数类型和除了基本类型之外的任何东西的符号“[MarshalAs]”都非常容易出错,特别是对于没有经验的用户。 – 2013-03-04 15:58:28
你确切的问题是什么?第二部分在哪里?就我所能看到的,您不使用'StringBuilder',而使用'string'。 – 2013-03-04 15:24:57
@ZdeslavVojkovic我猜他的意思是在'FromManagedtoUnmanaged'的实现中,你不会将'StringBuilder'传递给函数,通常我不这么认为 – 2013-03-04 15:28:43
。由于它是非托管的,他不能使用'StringBuilder'。对于互操作,通常将'StringBuilder'发送给函数,这些函数会改变字符串的状态,因为字符串是不可变的。 – 2013-03-04 15:33:29