从非托管C ++ DLL返回字符串到C#

as2005

我正在尝试从C#调用非托管C ++,但是收到有关返回值的异常。例外:

'System.Runtime.InteropServices.MarshalDirectiveException:'无法编组'返回值':无效的托管/非托管类型组合(只能将数组编组为LPArray,ByValArray或SafeArray)。

我有一个类似的函数,看起来很一样,没有返回值(void)可以正常工作,没有任何问题。

我将c ++项目的平台(编译器)设置为v100(Visual Studio 2010),并在c#项目中使用.net 4.5。

C ++项目创建了一个lib + dll文件,我将它们都放在了可执行文件夹中。

当我尝试在C#代码处将返回值替换为“ String”时,异常转换为:

System.AccessViolationException:'试图读取或写入受保护的内存。这通常表明其他内存已损坏。

删除返回值函数属性([return: MarshalAs(UnmanagedType.BStr)])时,收到以下异常:

'System.Runtime.InteropServices.MarshalDirectiveException:'无法编组'返回值':无效的托管/非托管类型组合。'

当我进行以下组合时:删除返回值函数属性并将返回类型转换为字符串,应用程序将关闭自身而不会捕获任何异常。

C ++代码

extern "C"
{
    ExternalDll_API char* FuncA(char* projectId);
}

ExternalDll_API char* FuncA(char* projectId)
{
    return "abc";
}

C#代码

[DllImport("ExternalDll.dll")]
[return: MarshalAs(UnmanagedType.BStr)]
public static extern char[] FuncA(string projectId);

var key = FuncA(projectId.ToString());
古斯曼

要从C ++ dll接收以null结尾的字符串,您可以执行以下操作:

1-将返回类型更改为IntPtr

[DllImport("ExternalDll.dll")]
public static extern IntPtr FuncA(string projectId);

2-使用元帅从指针中检索字符串:

var result = FuncA(someString);
var strResult = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(result);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章