使用P / Invoke跨C ++ / C#边界管理非托管字符串

异灵长类

我声明了以下结构(C ++):

struct NativeOperationResult {
    const INTEROP_BOOL Success; // INTEROP_BOOL = char
    const char16_t* const ErrorMessage;

    NativeOperationResult(const NativeOperationResult& c);
    /* various constructors, omitted for brevity */
};

现在,我在其他地方有一个导出的函数定义:

extern "C" __declspec(dllexport) NativeOperationResult ReturnFailureWithMessage() {
    return { INTEROP_BOOL_FALSE, "Test" };
}

我的期望是ReturnFailureWithMessage通过P / Invoke从C#调用(一种测试方法,如果您想知道的话)。NativeOperationResult构造函数中,它获取“ Test”的副本并将其放入中ErrorMessage

NativeOperationResult具有的所有权,char16_t*因此在销毁该结构时,我需要将其删除。没问题,但是我不想在.NET CLR有机会将字符串复制到托管堆之前删除内存。

坦白说,我对删除该内存的位置有点模糊。我认为C ++编译器将复制我的struct(或直接移动它),然后CLR将使用该副本...这意味着我应该使用删除.NET中的本机内存Marshal.FreeHGlobal

那是对的吗?

埃蒂·克里斯·埃玛(Erti-Chris Eelmaa)

不,那是不正确的。您需要区分两种情况:

1)您没有在C ++方面进行任何分配。您现在正在谈论的就是这种情况

2)您确实在C ++方面进行了分配,因此需要注意释放。

因此可以回答您的问题:不,您的示例不需要任何“删除”内存,因为没有人明确分配内存。

第二种情况比较棘手。如果使用C ++进行内存分配new char16_t[blah],则需要使用释放内存delete[] nativeOperationResult.ErrorMessage这在C#端是不可能的。可以使用不同的分配器(例如; mallocnew分配内存而C#不知道如何处理这些指针。

您需要向添加新的标记NativeOperationResult(例如)DeletionRequired,并从非托管端导出新功能:FreeNativeOperationResultIfNeeded(..)这里有更长的讨论

您可以使用C ++避免所有这些废话strings它们神奇地工作,不需要删除。

struct NativeOperationResult {
    const INTEROP_BOOL Success; // INTEROP_BOOL = char
    const string const ErrorMessage;

    NativeOperationResult(const NativeOperationResult& c);
    /* various constructors, omitted for brevity */
};

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用非托管导出将字符串从 C# 返回到 C++ 返回数字

通过 P/Invoke 将可写字符串数组从 C# 传递给 C++

无法将字符串从托管C#传递到非托管C

我应该如何使用P / Invoke将字符串数组传递给C库?

如何使用p / invoke终止C#调用的C ++函数

使用P / Invoke从C#将“ EGLRenderResolutionScaleProperty”编组到ANGLE

如何使用P / Invoke在C#中返回列表?

使用P / Invoke的c#调用方法导致AccessViolation异常

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

来自非托管方法的字符串中的C#垃圾数据

跨平台C ++:使用本机字符串编码还是跨平台标准化?

使用C#检查URL中是否存在非值查询字符串

使用C#流利接口的FsCheck生成的非空字符串生成器

C#删除边界内的字符串

CFDictionary使用非托管字符串?

在C#中使用非托管DLL

使用C#计算Cookie字符串中的字符

如何使用 c# 替换字符串中的字符?

什么是“使用???” 使用 NUGET HDF.P/Invoke 的 C# 中的语句?

使用C宏将字符串转换为非字符串

P /调用-从C#调用非托管DLL

当_Out_参数可以为NULL或非NULL时,使用P / Invoke在C#中调用Win API

使用 AWK 跨非连续行匹配字符串

使用C#使用FsCheck生成随机字符串

C#如何跨表格使用变量

使用C#检查字符串是否在字符串数组中包含字符串

通过dll边界的C字符串

C ++中字符串的边界框

获取字符串c#中字符边界内的特定字符