如何将元帅分配的内存归零?
我正在通过Marshal.AllocHGlobal在应用程序中分配一些不受管理的内存.然后,我将一组字节复制到此位置,然后将所得的内存段转换为struct,然后通过Marshal.FreeHGlobal再次释放内存. . 这是方法: public static T Deserialize(byte[] messageBytes, int start, int length) where T : struct { if (start + length > messageBytes.Length) throw new ArgumentOutOfRangeException(); int typeSize = Marshal.SizeOf(typeof(T)); int bytesToCopy = Math.Min(typeSize, length); IntPtr targetBytes = Marshal.Allo
22 2023-03-24
编程技术问答社区
没有装箱的Marshal.StructureToPtr
是否有一种方法可以将结构(可能存储在A typedReference 中)填充,而无需实际拳击?该结构的类型在运行时不知道,因此我无法使用结构的通用过载(.NET 4.5.1).我可以得到 structuretoptr 过载的方法,但是似乎没有一种方法可以调用它传递通用参考或 typedReference .. 编辑:通用 structuretoptr 仍然包装结构,因此尝试调用它是没有用的. 解决方案 我终于找到了答案, SafeBuffer 类.它完全包含我想要的 - 使用TypedReference和通用参数的编组方法结构.因此,制作包装器真的很简单: public static unsafe class InteropTools { private static readonly Type SafeBufferType = typeof(SafeBuffer); public delegate void PtrToStructureNative
4 2023-03-19
编程技术问答社区
C#调用一个DLL函数,返回一个指向结构数组的指针
我尝试了各种方法的许多不同组合来召集此调用.这是一个dll,它将指针返回到指向一系列结构的指针.诸如Debugport之类的类型实际上是枚举. /** * \struct debugConnectParameters * \brief Get device characterization and specify connection parameters through ST-LINK interface. */ typedef struct debugConnectParameters { debugPort dbgPort; /**
0 2023-03-19
编程技术问答社区
如何在非托管内存中实例化一个C#类?(可能吗?)
更新:现在有一个可接受的答案"有效".您永远都不应该,永远不要使用它. Ever . 首先,让我说我是游戏开发人员,让我提出问题.有一个合法的 - 如果非常不寻常 - 与性能有关的原因是要这样做的原因. 说我有这样的C#类: class Foo { public int a, b, c; public void MyMethod(int d) { a = d; b = d; c = a + b; } } 没什么花哨的.请注意,这是一种仅包含值类型的参考类型. 在托管代码中,我想拥有这样的东西: Foo foo; foo = Voodoo.NewInUnmanagedMemory(); //
4 2023-03-15
编程技术问答社区
在C#库和C++(CLR)之间传递对象
如何将对象从C#库传递到C ++. 我可以调用返回void或int的函数. 现在考虑C#中的以下功能, List CSharpFunction(string Input) 我的C#类包含在哪里, public class CSharpClass { string mystring = string.Empty; byte[] bytearray = null; public byte[] bytearray { get { return bytearray ; } set { bytearray = value; } } public string mystring { get { return mystring ; } set { mystring = value; } }
50 2023-03-02
编程技术问答社区
使用PInvoke向被管理对象传递句柄时遇到的问题
我对如何将句柄传递给我的托管对象从.NET到不受管理的代码感到非常困惑.现在,我使用C#为Oracle Siebel CRM开发了一种"驱动程序".以及我如何面对如何将手柄传递到的问题 驱动程序API具有这样的方法: ISCAPI ISC_RESULT CreateISCDriverInstance /* in */(const ISC_STRING mediaTypeStr, /* in */ const ISC_STRING languageCode, /* in */ const ISC_STRING connectString, /* in */ const struct ISC_KVParamList* datasetParams, /* out */ ISC_DRIVER_HANDLE* handle); 我有最后一个参数isc_driver_handle* handle的问题.我想说这看起来很奇怪,但是我没有ISC_DRIVER_HANDLE类型的定义. 据
38 2023-02-14
编程技术问答社区
直接读写解锁位图的非托管内存(Scan0)
是可以直接写入和读取从解锁的位图非托管内存? 我可以在i unlockbits的位图之后继续使用bitmapdata吗?我做了一个测试应用程序,在其中我可以在另一个线程将像素写入同一位图的情况下读取照片框的位图的像素. 编辑1:作为Boing已在答案中指出:"scan0不指向位图对象的实际像素数据;相反,它指向代表a的临时缓冲区位图对象中的像素数据的部分."来自 msdn . 但是一旦我得到了扫描器,我就可以读/写入位图,而无需锁定或解密!我在一个线程中做了很多次.因此,对于MSDN,不应发生,因为Scan0指向位图数据的副本!嗯,在C#中所有测试都显示它不是副本.在C ++中,我不知道它是否应该工作. 编辑2:使用旋转方法某些时候使操作系统释放位图像素数据副本.结论,it is not safe to read/write an unlocked Bitmap Scan0.谢谢鲍威的答案和评论! 下面是我如何获得位mapdata并读写像素值.
30 2023-01-28
编程技术问答社区
两个不同的GCHandle指向内存中的同一个数组
这可能不是一个很好的问题,因为我不确定发生了什么,所以我不知道该如何指出.我正在尝试学习,希望我能为此方向一些方向.您对新手的耐心表示赞赏. 我有一个我正在修改的代码.它显示图像.我想修改图像,并将其显示在其他窗口中.我复制显示图像,进行修改的代码,并为原始图像和修改后的图像显示修改后的图像. 似乎GCHANDLE一直在指出相同的内存吗?我不是通过更改手柄名称而真正制作新的手柄吗?对不起,很长的代码,但我只是迷路了. 出了什么问题? 最令人困惑的是它在工作,然后我更改了一些东西,现在无法回到工作版本,我认为我的代码与工作的代码相同.有些设置一些地方? System.Runtime.InteropServices.GCHandle gch3 = System.Runtime.InteropServices.GCHandle.Alloc(scaled, System.Runtime.InteropServices.GCHandleType.Pinned);
16 2022-11-23
编程技术问答社区
F# NativePtr.stackalloc 意外的堆栈溢出
仍然进行我的F#性能测试,并尝试使基于堆栈的数组正常工作.有关更多背景,请参阅此处: f#f#bativeptr.stackalloc在struct constructor中/p> 据我了解,每个功能调用都应在堆栈中获得自己的框架.然后,通过将堆栈指针移回返回后,将释放此内存.但是,下面会导致堆栈溢出错误 - 不确定为什么在函数内执行stackalloc. 有趣的是,这仅在发布模式下发生,而不是调试模式. 我相信dotnet中的标准堆栈尺寸为1MB,我没有调整我的调整.我希望分配8192 INT(32768字节)不要吹堆. #nowarn "9" module File1 = open Microsoft.FSharp.NativeInterop open System open System.Diagnostics let test () = let stackAlloc x =
14 2022-09-18
编程技术问答社区
f# NativePtr.stackalloc在结构上的构建方法
我正在进行一些F#性能测试,并试图在堆栈上创建一个数组,然后试图在堆上创建一个(值与参考类型).我正在使用本机Ptr.stackalloc在堆栈上分配内存.在下面的第一个构造函数中获取错误. type StackArray(10) // This works fi
40 2022-09-18
编程技术问答社区
两个不同的GCHandle指向内存中的同一个数组
这可能不是一个措辞恰当的问题,因为我不确定发生了什么,所以我不知道如何有针对性地问它.我正在努力学习,我希望我能在这方面得到一些指导.感谢您对新手的耐心. 我正在修改一段代码.它显示图像.我想修改图像,并将其显示在不同的窗口中.我复制显示图像的代码,进行修改,然后它显示原始图像和修改后的图像的修改后的图像. GCHandle 似乎一直在引用相同的内存?我不是真的通过更改手柄名称来制作新手柄吗?抱歉,代码很长,但我迷路了. 怎么了? 最令人困惑的是它正在工作,然后我改变了一些东西,现在无法回到工作版本,虽然我认为我的代码与工作的代码相同.一些设置在哪里? System.Runtime.InteropServices.GCHandle gch3 = System.Runtime.InteropServices.GCHandle.Alloc(scaled, System.Runtime.InteropServices.GCHandleType.Pinned);
376 2022-09-04
编程技术问答社区
在C#中的WinDivert
我想打电话给在C#code 5 WinDivert功能,第一个反应:这里的PInvoke是签名: 内部枚举WINDIVERT_LAYER { WINDIVERT_LAYER_NETWORK = 0,/ *网络层。 * / WINDIVERT_LAYER_NETWORK_FORWARD = 1 / *网络层(转发的数据包)* / } 内部常量UINT64 WINDIVERT_FLAG_SNIFF = 1; / * * typedef结构 { UINT32 IfIdx; UINT32 SubIfIdx; UINT8方向; } WINDIVERT_ADDRESS,* PWINDIVERT_ADDRESS; *
4788 2022-07-19
编程技术问答社区