gpt4 book ai didi

c# - 将字符串从非托管 c++ dll 返回到 c#

转载 作者:搜寻专家 更新时间:2023-10-31 00:54:05 25 4
gpt4 key购买 nike

<分区>

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

System.Runtime.InteropServices.MarshalDirectiveException: 'Cannot marshal 'return value': Invalid managed/unmanaged type combination (Arrays can only be marshaled as LPArray, ByValArray, or SafeArray).'

我有一个类似的函数,在没有返回值 (void) 的情况下看起来一样,但没有任何问题。

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

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

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

System.AccessViolationException: 'Attempted to read or write protected memory. This is often an indication that other memory is corrupt.'

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

System.Runtime.InteropServices.MarshalDirectiveException: 'Cannot marshal 'return value': Invalid managed/unmanaged type combination.'

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

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());

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com