Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在进程跃点期间将非托管转换为托管_C++_Wcf_Interop_Unmanaged_Managed - Fatal编程技术网

C++ 在进程跃点期间将非托管转换为托管

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));

首先,我要感谢马特·戴维斯的帮助。我知道这篇文章并没有被选为那个具体问题的答案,但是这篇文章对我非常有帮助。我有几个小问题需要解决(主要是在他提供的代码中调整文件名),但是我很容易用C++的桥接方法创建一个C托管WCF服务的非托管C++客户端。 我现在正在探索如何改进那里介绍的基本概念。以下是Matt帖子中HelloServiceClientBridge.cpp文件中的一段代码:

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
现在,我意识到,当我们处理非托管和托管互操作以及进程间通信时,一些复制是不可避免的,但我想知道是否可以避免一些这种复制。对于一个简单的HelloWorld类型的示例来说,这不是什么大问题,但是如果传递了大量数据,那么从非托管复制到托管,然后再从一个进程复制到另一个进程的成本可能会很大。因此,我想知道是否有一种方法可以在进程间通信发生的同时将非托管数据编组到托管数据编组和/或反之亦然

我考虑的一种可能性是修改代码,以便将字符串从非托管字符串直接复制到格式化为托管字符串的WCF消息中。我想既然我们必须在那一点上复制一份,如果那份复制品也能起到早期复制品的作用那就太好了,这样我们就可以一箭双雕了

另一种可能性是,通过WCF消息将一个非托管指针从C++进程传递到C服务,然后通过C服务将其编组到托管字符串。当然,要弄清楚谁负责为指针分配内存和取消分配内存,这可能会非常麻烦,但复制会减少,WCF消息大小也会显著减少


谢谢你的任何想法

>我已经开始探索WWSAPI,作为一种创建WCF服务的C++客户端的方法。到目前为止,这个解决方案似乎运行得很好