c# - 将指针传递给另一个进程

标签 c# .net vb.net clr marshalling

我正在尝试将指向结构的指针传递给我创建的另一个进程...我在发送指针的进程中除了无效指针错误之外什么也没有得到...这在 .NET 中是否可能? ?

我的发送过程代码:

' Initialize unmanged memory to hold the struct.
Dim ptrSettings As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(EngineSettings))

' Copy the struct to unmanaged memory.
Marshal.StructureToPtr(EngineSettings, ptrSettings, False)

SendMessage(HWND, MSG_SETTINGS_STRUCT, 0, ptrSettings)

我在第二个进程中重写 WinProc 以接收 LParam 中的消息:

EngineSettings = CType(Marshal.PtrToStructure(ptr, GetType(SettingsStruct)), SettingsStruct)

' Free the unmanaged memory.
Marshal.FreeHGlobal(ptr)

两个进程之间的指针值相同,这是第二个进程中的错误:

错误代码为0xc0000005。此错误可能是 CLR 中的错​​误或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括 COM 互操作或 PInvoke 的用户编码错误,这可能会损坏堆栈。

最佳答案

进程通常不能共享内存。请记住,大多数地址实际上是虚拟地址,并不指向物理硬件位置,而是指向页面和偏移量。

win32 函数返回指针,因为它们在进程地址空间内运行,而不是单独的进程。

参见Memory managment options in Win32有关所有 native 调用如何在 Win32 中实际分配内存的更多信息(至少来自用户模式代码)。该页面上唯一没有提到的是 Large-Page Support它创建非标准页面并且无法分页到磁盘。即使在 C/C++ 中,这些页面也可能很难使用,因此我强烈建议不要在 CLR 中使用它们。

如果您想直接共享此 native 结构,您可能需要使用共享内存。 Creating Named Shared Memory (Win32)

关于c# - 将指针传递给另一个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11990799/

相关文章:

c# - GetCustomAttributes 不返回值

.net - 为什么 AndAlso 不能替代 And

mysql - 具有 AND 匹配功能的多列 IN SELECT

vb.net - String.format 将点更改为逗号

c# - 在 C# 中从字符串创建 JSON 对象

c# - 高频堆

c# - 如何仅在 XAML 中设置上边距?

c# - 为什么依赖于平台的编译不起作用?

c# - 我应该创建单元测试基地吗

c# - 如何像 Stackoverflow 上那样创建 "drag and select"图表?