从c++包装中调用c#方法

本文关键字:方法 调用 c++ 包装 | 更新日期: 2023-09-27 18:02:05

我有一个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"answers"sTemp1Call"是无效的。为什么?我有什么问题?我哪里错了?

谢谢

从c++包装中调用c#方法

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

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

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

你的函数有参数,如果你想在调用后得到值,你需要保持在。net对象周围,PtrToStringAnsi将字符串复制到一个新的String^对象,所以你需要将它复制回你的原生ptr。