gpt4 book ai didi

c# - c++/c# 编码结构以获取固定指针

转载 作者:太空宇宙 更新时间:2023-11-04 12:19:32 24 4
gpt4 key购买 nike

我有一个旧的应用程序,它接受 dll 插件。每个插件都有一个创建“小部件”新实例的功能。此函数通过返回唯一的 int 来标识新的“小部件”实例。在 c++ 插件模板中,我通过声明一个新的小部件 struct 并将其指针转换为 int 作为唯一标识符返回(不是我的想法,但我必须使用它):

struct widget {
...
};

int widget_instance (HWND hwnd) {
widget* myWidget = new widget;
...
return (int) myWidget;
}

我正在为这个应用开发一个 c# 插件,我需要在 c# 中复制这个机制。我如何在函数内声明一个结构,以便每次调用该函数时它返回一个固定的、不变的指向新声明的结构的指针?到目前为止我的代码:

public struct Widget {
...
}

public static int widget_instance(uint hwnd) {
Widget w = new Widget();
...
IntPtr myWidget = Marshal.AllocCoTaskMem(Marshal.SizeOf(w));
Marshal.StructureToPtr(w, myWidget, false);
return (int) myWidget;
}

这看起来对吗?我是否需要“固定”结构才能像 C++ 一样工作?

编辑:详细说明:唯一 ID 不仅仅是一个简单的“cookie”int,它实际上稍后在 c++ 模板中用于访问 struct 实例通过将 ID 转换为指针:

widget* w = (widget*) WidgetID;
w->firstElement = 123;

我假设 C# 等价物是:

widget w = (widget)Marshal.PtrToStructure((IntPtr)widgetID,typeof(widget));
w.firstElement = 123;

最佳答案

您似乎暗示返回的整数标识符只是一个 cookie,应用程序不会将其视为指针。这意味着应用程序永远不会对小部件执行操作,但总是要求插件代表应用程序执行操作。如果是这种情况,那么您没有理由不能使用自己的方案来分配 cookie 标识符。所以……

您可以将一个“cookie”成员添加到您的 Widget 类,以及一个用于分配 cookie 的静态“下一个 cookie”成员。这将是一个简单且语义合理的实现。显然,它需要线程安全措施。它还可以避免将“this”指针强制转换为 int 的 C++ 技术,尽管我认为它非常好,但你说你不喜欢这种技术。

除了提供唯一标识符之外,C++ 指针到整数的转换技术还可以用于第二个目的。当应用程序为插件提供 cookie 时,插件可以通过将 cookie 转换回指针来直接找到小部件,并且运行时成本为零。虽然那几乎不安全。但我不认为你可以在 C# 中做到这一点。

您提议的 C# 代码意味着对于应用程序要求的每个小部件,您都可以随意创建和初始化第二个小部件。如果您真的想模仿 C++ 技术,以便保证您的 cookie 在整个进程范围内是唯一的,而不是仅在单个插件内唯一,那么您可以只分配一个字节的 block 但不对其进行初始化。甚至是零大小的 block ,但我不太确定这会产生唯一地址。

关于c# - c++/c# 编码结构以获取固定指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5878369/

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