gpt4 book ai didi

c# - 在非托管 DLL 中存储 "managed"上下文参数

转载 作者:行者123 更新时间:2023-11-30 18:40:23 25 4
gpt4 key购买 nike

我不知道这是不是一个坏主意。我在 C# 中使用非托管 DLL(由我编写)。

有一些回调函数可以在DLL中设置,但这些只能映射到C#端的静态类成员。

因为我想对特定类实例进行回调操作,所以我想知道将类实例指针存储在 DLL 的状态信息中是否安全。

从 DLL 的角度来看,这将只是一个 32 位上下文整数,但从 C# 端来看,这将是一个实际的类“指针”或“引用”,回调签名定义如下:

public delegate void StatusChangeHandler(ContextClass context, int someCallbackValue);

它确实编译并且看起来确实有效,我只是不知道这是否得到保证。这是可接受的做法吗?

最佳答案

我在这里看到的一个问题是 .Net 有一个垃圾收集器,它可以移动你的类。所以你保存的指针可能会失效。为了防止简单类型出现这种情况,您应该像这样固定对象:

byte[] b = new byte[1000];
// pin b, and get pointer to the first element.
fixed (byte* ptr = &b)
{
//use your fixed pointer to b. b will not be moved untill code leaves fixed region.
}

虽然,对于复杂类型,.Net 可能足够智能来自动固定对象,但我不会依赖它。所以你写了这样的东西:

var ctx = new Context();
fixed (IntPtr ptr = &ctx)
{
StatusChange(ptr);
// do other stuff, and don't leave fixed region, until you can clear the pointer in the native library.
}

但实际上,我认为更简单和可靠的方法是为您的上下文对象创建一个静态字典,并只为您的 native dll 提供该字典的键,它可以是数字、字符串或 GUID。例如。任何值,而不是指针。

关于c# - 在非托管 DLL 中存储 "managed"上下文参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8326515/

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