从 c++ wrap 调用 c# 方法

Posted

技术标签:

【中文标题】从 c++ wrap 调用 c# 方法【英文标题】:Call c# method from c++ wrap 【发布时间】:2014-05-07 13:49:02 【问题描述】:

我有一个具有此功能的 c# 库:

public static int myGetStrings(String sOne, out String sTemp1, out String sTemp2)

    sTemp1 = sOne+"1";
    sTemp2 = sOne+"2";
    return 0;

我的 c++ 包装器调用 c# 库:

char sOneCall[256],sTemp1Call[256],sTemp2Call[256];
sprintf(sOneCall,"this is a test");

int iReturnData = myLibraryClass-> myGetStrings(
    Marshal::PtrToStringAnsi((IntPtr) (char *)sOneCall), 
    Marshal::PtrToStringAnsi((IntPtr) (char *)sTemp1Call),
    Marshal::PtrToStringAnsi((IntPtr) (char *)sTemp2Call) );

但是当我执行我的代码时,变量“sTemp1Call”和“sTemp1Call”是无效的。 为什么?我的问题是什么?我哪里错了?

谢谢

【问题讨论】:

【参考方案1】:

我假设您使用的是 c++/cli。如果是这样就不需要使用 marshal 你可以直接传递一个字符串。

String ^sOneCall = "this is a test";
String ^sTemp1Call = "";
String ^sTemp2Call = ""


int iReturnData = myLibraryClass-> myGetStrings(sOneCall,sTemp1Call,sTemp2Call); 

如果您想在调用后获取值,则您的函数没有参数,您需要在 .net 对象周围保留一个 PtrToStringAnsi 将字符串复制到一个新的 String^ 对象,因此您需要将其复制回您的本机点。

【讨论】:

以上是关于从 c++ wrap 调用 c# 方法的主要内容,如果未能解决你的问题,请参考以下文章

在 WP8 中从 C++ 代码调用 C# 方法

从 c# 调用 C++ 代码

从 C++ 调用 C# 代码

从 C# 调用 C++ dll 方法/类

有啥方法可以调试从 C# DllImport 调用的 c++ dll?

从传递回完整对象模型的非托管 C++ 调用 C# 方法