gpt4 book ai didi

c# - 编码 C# 枚举数组以在 C++ 代码中修改

转载 作者:太空宇宙 更新时间:2023-11-04 14:03:27 25 4
gpt4 key购买 nike

我有一个预构建的 C++ API,它将指向枚举数组的指针和数组的长度作为输出参数,并返回修改后的值的数量。该函数的目的是在数组中设置值以供以后使用。我正在尝试从 C# 代码调用此函数,其中包括它自己的枚举版本。

C++ 函数签名如下所示:

static int DoAThing(SomeEnum outArray[], int length)

我的 C# 函数调用目前看起来像这样:

[DLLImport("API.dll", EntryPoint="DoAThing")]
public static extern int DoAThing([MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.U4, SizeParamIndex = 1)]ref WrappedEnum[] outArray, int length);

我的调用代码如下:

int length = 10;
WrappedEnum[] outArray = new WrappedEnum[length];
DoAThing(ref outArray, length);

我能够很好地调用该函数,但每当它试图返回到没有有用的调用堆栈或信息的托管代码时,我总是收到 NullReferenceException。我也尝试过使用 GCHandle.Alloc 将 outArray 包装在 GCHandle 中,但没有成功。有什么想法吗?

最佳答案

我设法让它工作了。其中一些步骤可能是不必要的,但它们似乎并没有什么坏处:

我在函数顶部添加了一个 SecurityPermission 属性:

[SecurityPermission(SecurityAction.Demand, UnmanagedCode = true)]

并用固定 block 包装调用代码本身:

fixed (WrapperEnum* ptr_to_enum = &outArray[0]) { DoAThing(ref outArray, length); }

我还使用 GCHandle.Alloc 将枚举数组包装在 GCHandle 中,并在调用后释放它以确保它得到正确清理。

关于c# - 编码 C# 枚举数组以在 C++ 代码中修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18134139/

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