将C#字符串传递给C++/CLI在CPP程序中不显示字符串值 我想用C++调用C+I函数,通过CLI/C++。p>

将C#字符串传递给C++/CLI在CPP程序中不显示字符串值 我想用C++调用C+I函数,通过CLI/C++。p>,c#,c++,c++-cli,C#,C++,C++ Cli,C#代码 理想情况下,setText只能有注释行。_text=“HI World”就是一个例子 public string getText() { return _text; } C++/CLI代码 标题: gcroot<Bridge> _managedObject; virtual void setText(std::string text); virtual std::string getText(); //_managedObject=gcnew Bridge()

C#代码

理想情况下,setText只能有注释行。_text=“HI World”就是一个例子

public string getText()
{
    return _text;
}
C++/CLI代码

标题:

gcroot<Bridge> _managedObject;

virtual void setText(std::string text);
virtual std::string getText();
//_managedObject=gcnew Bridge(); 返回(封送为(_managedObject->getText()); }

//_managedObject=gcnew Bridge(); _managedObject->setText(gcnewsystem::String(text.c_str()); }

注意:当我使用以下代码时

virtual void setText(System::String^ text);
virtual System::String^ getText();
我得到以下错误3395

*__declspec(dllexport)不能应用于具有_clrcall调用约定的函数*

,所以我坚持使用std::string

<>我从C++/CLI代码中使用库,从C++程序调用,打印“HI Word”;相反,什么也不会被打印出来

C++控制台应用程序

IStringBridgeWrapper *pBridge = IStringBridgeWrapper::CreateInstance();

pBridge->setText(std::string("I am here"));
pBridge->getText();
我认为字符串没有正确传递

如有任何解决方案,将不胜感激

编辑

我已经在注释之后更新了代码,但是没有显示任何内容

gcroot创建句柄,但不为其分配内存。但是由于桥接器没有分配内存,应用程序无法工作

<>我想用C++调用C+I函数,通过CLI/C++ ++。 等等。。。你想从C++中调用C++函数,对吗?这就是C++/CLI的好处。在管理环境中包装C++代码是可访问的。如果您真的想从C++调用C.*代码,那么应该查看COM注册C代码。如果你使用C++ + CLI,你的整个C++程序将被拖到.NET世界,你可以从一开始就使用C。 在C++/CLI中,ref(.NET)类的整个公共类接口应该只包含托管类型。那将是
System::String^
而不是
std::String

COM是你的朋友:

在C中创建一个接口#

实现C#接口:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace CsharpLibrary
{
   [Guid("C6659361-1625-4746-931C-36014B146679")]
   public class MyStringHolder : IStringHolder
   {
      String _text;

      public String GetText()
      {
         return this._text;
      }

      public void SetText(String value)
      {
         _text = value;
      }

   }
}
从C创建并调用C#对象++

#include <windows.h>
#include <stdio.h>

#pragma warning (disable: 4278)

// To use managed-code servers like the C# server, 
// we have to import the common language runtime:
#import <mscorlib.tlb> raw_interfaces_only


#pragma warning (disable: 4278)

// To use managed-code servers like the C# server, 
// we have to import the common language runtime:
#import <mscorlib.tlb> raw_interfaces_only

#import "..\CsharpLibrary\bin\Debug\CsharpLibrary.tlb" no_namespace named_guids





int main(int argc, char* argv[])
{
   HRESULT hr = S_OK;

   IStringHolder *pStringHolder = NULL;

   //
   // Initialize COM and create an instance of the InterfaceImplementation class:
   //
   CoInitialize(NULL);

   hr = CoCreateInstance(   __uuidof(MyStringHolder),
                           NULL,
                           CLSCTX_INPROC_SERVER,
                           __uuidof(IStringHolder),
                           reinterpret_cast<void**>(&pStringHolder));

   if(SUCCEEDED(hr))
   {
      _bstr_t sHelloWorld = SysAllocString( L"Hello, World" );

      hr = pStringHolder->SetText(sHelloWorld);

      SysFreeString(sHelloWorld);
   }


   //
   // Be a good citizen and clean up COM
   //
   CoUninitialize();

   return hr;
}
#包括
#包括
#杂注警告(禁用:4278)
//要使用托管代码服务器,如C#服务器,
//我们必须导入公共语言运行时:
#仅导入原始接口
#杂注警告(禁用:4278)
//要使用托管代码服务器,如C#服务器,
//我们必须导入公共语言运行库:
#仅导入原始接口
#导入“.\CsharpLibrary\bin\Debug\CsharpLibrary.tlb”没有名为\u guids的\u命名空间
int main(int argc,char*argv[])
{
HRESULT hr=S_正常;
IStringHolder*pStringHolder=NULL;
//
//初始化COM并创建InterfaceImplementation类的实例:
//
共初始化(空);
hr=CoCreateInstance(uuuidof(MyStringHolder),
无效的
CLSCTX_INPROC_服务器,
__uuidof(IStringHolder),
重新解释铸造(&pStringHolder));
如果(成功(hr))
{
_bstr_t sHelloWorld=SysAllocString(L“你好,世界”);
hr=pStringHolder->SetText(sHelloWorld);
SysFreeString(sHelloWorld);
}
//
//做一个好公民,清理垃圾
//
coninitialize();
返回人力资源;
}
在C端,您必须生成类型库并通过后期生成事件注册类:

生成类型库: “$(FrameworkDKDir)bin\NETFX 4.0 Tools\tlbexp.exe”“$(TargetPath)”/out:”$(TargetDir)$(TargetName).tlb”

注册课程: C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe“$(TargetPath)”


享受吧

如果我理解正确,为什么您要在CPP/CLI
getText
函数中创建一个新的
Bridge
实例,这不会重置C#类中的
\u text
对象吗?您正在getText和setText函数中创建一个新的Bridge实例。这当然行不通,因为您刚刚创建了对象,所以getText将始终返回空字符串。包装器需要一个Bridge实例作为成员。检查你最喜欢的C++语言包,我也认为这可能是个问题。谢谢你指点。我有gcroot(u managedObject),;我应该用这个吗?(请看编辑后的帖子)那么你怎么看待我在setText中传递的字符串;我应该更新它。你如何在控制台上显示文本?是否调试了C++代码并确认返回的字符串实际上是空的?@ ReSalpPo.I确实放置了一些控制台。WrdLeNeX语句,检查流程,流程如预期的那样,C++到C++ + CLI到C。它也被称为反向平沃克。我已经在我的问题中证明了一个链接,请看一下。C++和C语言中存在一个代码库,所以我必须去C++。我知道字符串的部分-我已经解释了为什么我不使用它。正如其他评论所指出的,我们可能需要桥梁类的参考;但我发现很难做到这一点,“我已经证明了”应该理解为“我已经证明了”。对不起,打错了。
virtual void setText(System::String^ text);
virtual System::String^ getText();
IStringBridgeWrapper *pBridge = IStringBridgeWrapper::CreateInstance();

pBridge->setText(std::string("I am here"));
pBridge->getText();
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;


namespace CsharpLibrary
{
   // Since the .NET Framework interface and coclass have to behave as 
   // COM objects, we have to give them guids.
   [Guid("56A868B1-0AD4-11CE-B03A-0020AF0BA770"),
    InterfaceType(ComInterfaceType.InterfaceIsDual)]
   public interface IStringHolder
   {
      String GetText();
      void SetText(String s);
   }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace CsharpLibrary
{
   [Guid("C6659361-1625-4746-931C-36014B146679")]
   public class MyStringHolder : IStringHolder
   {
      String _text;

      public String GetText()
      {
         return this._text;
      }

      public void SetText(String value)
      {
         _text = value;
      }

   }
}
#include <windows.h>
#include <stdio.h>

#pragma warning (disable: 4278)

// To use managed-code servers like the C# server, 
// we have to import the common language runtime:
#import <mscorlib.tlb> raw_interfaces_only


#pragma warning (disable: 4278)

// To use managed-code servers like the C# server, 
// we have to import the common language runtime:
#import <mscorlib.tlb> raw_interfaces_only

#import "..\CsharpLibrary\bin\Debug\CsharpLibrary.tlb" no_namespace named_guids





int main(int argc, char* argv[])
{
   HRESULT hr = S_OK;

   IStringHolder *pStringHolder = NULL;

   //
   // Initialize COM and create an instance of the InterfaceImplementation class:
   //
   CoInitialize(NULL);

   hr = CoCreateInstance(   __uuidof(MyStringHolder),
                           NULL,
                           CLSCTX_INPROC_SERVER,
                           __uuidof(IStringHolder),
                           reinterpret_cast<void**>(&pStringHolder));

   if(SUCCEEDED(hr))
   {
      _bstr_t sHelloWorld = SysAllocString( L"Hello, World" );

      hr = pStringHolder->SetText(sHelloWorld);

      SysFreeString(sHelloWorld);
   }


   //
   // Be a good citizen and clean up COM
   //
   CoUninitialize();

   return hr;
}