我想通过 CLI/C++ 从 C++ 调用 C# 函数。
C# 代码
private string _text = " ";
public void setText(string text)
{
// _text = text;
_text = "HI World";
}
理想情况下,setText 应该只有注释行。_text = "HI World" 就是一个例子。
public string getText()
{
return _text;
}
C++/CLI 代码
标题:
gcroot<Bridge> _managedObject;
virtual void setText(std::string text);
virtual std::string getText();
文件
std::string CStringBridge::getText()
{
// _managedObject = gcnew Bridge(); 返回 (marshal_as(_managedObject->getText())); }
void CStringBridge::setText(std::string text)
{
// _managedObject = gcnew Bridge(); _managedObject->setText(gcnew System::String(text.c_str())); }
IStringBridgeWrapper* IStringBridgeWrapper::CreateInstance(void)
{
return ((IStringBridgeWrapper *)new CStringBridge());
}
注意:当我使用以下代码时
virtual void setText(System::String^ text);
virtual System::String^ getText();
我收到以下错误 3395
*__declspec(dllexport) 不能应用于具有 __clrcall 调用约定的函数*
,所以我坚持使用 std::string
当我使用 C++/CLI 代码中的库并从我的 C++ 程序中调用时,应该打印“Hi World”;相反,什么都没有打印出来
C++ 控制台应用程序
IStringBridgeWrapper *pBridge = IStringBridgeWrapper::CreateInstance();
pBridge->setText(std::string("I am here"));
pBridge->getText();
我认为字符串没有被正确传递。
任何解决它的想法都将不胜感激。
编辑
我在评论后更新了代码,但没有任何显示。
gcroot 创建一个句柄,但不为其分配内存。但是由于 Bridge 没有分配内存,因此应用程序无法运行。我的代码在本文的同一行中 - http://www.codeproject.com/Articles/10020/Using-managed-code-in-an-非托管应用程序。