C++ 在进程跃点期间将非托管转换为托管
首先,我要感谢马特·戴维斯的帮助。我知道这篇文章并没有被选为那个具体问题的答案,但是这篇文章对我非常有帮助。我有几个小问题需要解决(主要是在他提供的代码中调整文件名),但是我很容易用C++的桥接方法创建一个C托管WCF服务的非托管C++客户端。 我现在正在探索如何改进那里介绍的基本概念。以下是Matt帖子中HelloServiceClientBridge.cpp文件中的一段代码:C++ 在进程跃点期间将非托管转换为托管,c++,wcf,interop,unmanaged,managed,C++,Wcf,Interop,Unmanaged,Managed,首先,我要感谢马特·戴维斯的帮助。我知道这篇文章并没有被选为那个具体问题的答案,但是这篇文章对我非常有帮助。我有几个小问题需要解决(主要是在他提供的代码中调整文件名),但是我很容易用C++的桥接方法创建一个C托管WCF服务的非托管C++客户端。 我现在正在探索如何改进那里介绍的基本概念。以下是Matt帖子中HelloServiceClientBridge.cpp文件中的一段代码: String^ message = client->SayHello(gcnew String(name));
String^ message = client->SayHello(gcnew String(name));
client->Close();
IntPtr ptr = Marshal::StringToHGlobalAnsi(message);
rv = std::string(reinterpret_cast<char *>(static_cast<void *>(ptr)));
String^message=client->SayHello(gcnewstring(name));
客户端->关闭();
IntPtr ptr=Marshal::StringToHGlobalAnsi(消息);
rv=std::字符串(重新解释强制转换(静态强制转换(ptr));
这里似乎要创建很多字符串的副本。以下是我看到的所有可能制作字符串副本的地方:
变量中字符串的原始非托管副本name
- 调用
时字符串的托管副本gcnew string(name)
- 我不确定,但是当托管字符串作为参数传递给
方法时,可能会创建另一个副本SayHello()
- 字符串被复制到发送到C#服务的WCF消息中
- 我不确定,但C#服务在收到消息时可能会创建另一个副本
- 我认为在调用
时会创建字符串的另一个副本string.Format
- 新的“Hello”字符串被复制到发送到客户端的WCF消息中
- 我不确定,但C#client在收到消息时可能会创建另一个副本
- 我不确定,但是当C++客户端返回字符串到C++桥 时可能会创建另一个副本。
- 调用
时,将创建新字符串的非托管副本Marshal::StringToHGlobalAnsi(message)
- 我不确定,但是当字符串转换为
std::string
另一种可能性是,通过WCF消息将一个非托管指针从C++进程传递到C服务,然后通过C服务将其编组到托管字符串。当然,要弄清楚谁负责为指针分配内存和取消分配内存,这可能会非常麻烦,但复制会减少,WCF消息大小也会显著减少
谢谢你的任何想法 >我已经开始探索WWSAPI,作为一种创建WCF服务的C++客户端的方法。到目前为止,这个解决方案似乎运行得很好