【发布时间】:2017-03-01 14:43:22
【问题描述】:
我一直在尝试用 C# 编组这个结构,但我在其中的最后两行遇到了麻烦。
typedef struct _modenv_
{
long lMajor; /* major version of kernel */
long lMinor; /* minor version of kernel */
long lRelease; /* release version of kernel */
long lResultSize; /* sResult buffer size */
long (__stdcall *lPGSM_ExecuteKernel) (struct _modenv_ *PGEnv, char *sCommand, char *sResult, long lLength);
long (__stdcall *lPGSM_ExecuteCommand)(struct _modenv_ *PGEnv, char *sCommand, char *sResult, long lLength);
} PGMODENV;
而我所做的只是:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct PGMODENV
{
/* input data */
public long lMajor; /* major version of kernel */
public long lMinor; /* minor version of kernel */
public long lRelease; /* release version of kernel */
/* updated data */
public long lResultSize; /* sResult buffer size */
}
如何在 C# 中实现它们?
【问题讨论】:
-
我见过这样的东西。如果编组是不可能的,我不会感到惊讶,因为您无法在内存中移动结构,因为缓冲区紧跟在结构之后。线索是缓冲区大小很长,但根本没有缓冲区指针。
-
它们是函数指针,在 C# 中完全等效的是委托对象。您必须小心,您传递的委托对象必须在某个地方有另一个引用,因此当本机代码进行函数调用时,GC 不会清理它们并使您的程序崩溃。也将它们存储在静态变量中或使用 GCHandle.Alloc()。
-
这些结构在导出函数中作为参数传递,它们会是 GC 吗?或者我应该如何防止它们被收集?
标签: c# c++ marshalling