当前位置: 首页 > 编程语言 > C#

无装箱的Marshal.StructureToPtr分享

时间:2023-04-11 12:09:04 C#

Marshal.StructureToPtr无装箱结构的类型在运行时是未知的,所以我不能使用StructureToPtr(.NET4.5.1)的通用重载。我可以获得StructureToPtr重载的MethodInfo,但似乎没有办法通过通用引用或TypedReference来调用它。编辑:通用StructureToPtr仍然封装结构,因此尝试调用它是无用的。我终于找到了答案,SafeBuffer类。它包含我想要的结果——一个带有TypedReference和泛型参数的编组方法结构。那么,制作封装器真的很简单:publicstaticunsafeclassInteropTools{privatestaticreadonlyTypeSafeBufferType=typeof(SafeBuffer);publicdelegatevoidPtrToStructureNativeDelegate(byte*ptr,TypedReferencestructure,uintsizeofT);publicdelegatevoidStructureToPtrNativeDelegate(TypedReferencestructure,byte*ptr,uintsizeofT);constBindingFlags标志=BindingFlags.NonPublic|BindingFlags.Static;privatestaticreadonlyMethodInfoPtrToStructureNativeMethod=SafeBufferType.GetMethod("PtrToStructureNative",标志);privatestaticreadonlyMethodInfoStructureToPtrNativeMethod=SafeBufferType.GetMethod("StructureToPtrNative",标志);publicstaticreadonlyPtrToStructureNativeDelegatePtrToStructureNative=(PtrToStructureNativeDelegate)Delegate.CreateDelegate(typeof(PtrToStructureNativeDelegate),PtrToStructureNativeMethod);公共静态只读StructureToPtrNativeDelegateStructureToPtrNative=(StructureToPtrNativeDelegate)Delegate.Create委托(类型(StructureToPtrNativeDelegate),StructureToPtrNativeMethod);privatestaticreadonlyFuncSizeOfHelper_f=(Func)Delegate.CreateDelegate(typeof(Func),typeof(Marshal).GetMethod("SizeOfHelper",flags));publicstaticvoidStructureToPtrDirect(TypedReferencestructure,IntPtrptr,intsize){StructureToPtrNative(structure,(byte*)ptr,unchecked((uint)size));}publicstaticvoidStructureToPtrDirect(TypedReferencestructure,IntPtrptr){StructureToPtrDirect(structure,ptr,SizeOf(__reftype(structure)));}publicstaticvoidPtrToStructureDirect(IntPtrptr,TypedReferencestructure,intsize){PtrToStructureNative((byte*)ptr,structure,unchecked((uint)size));}publicstaticvoidPtrToStructureDirect(IntPtrptr,TypedReferencestructure){PtrToStructureDirect(ptr,structure,SizeOf(__reftype(structure)));}publicstaticvoidStructureToPtr(refTstructure,IntPtrptr){StructureToPtrDirect(__makeref(structure),ptr);}民众staticvoidPtrToStructure(IntPtrptr,outTstructure){structure=default(T);PtrToStructureDirect(ptr,__makeref(structure));}publicstaticTPtrToStructure(IntPtrptr){Tobj;PtrToStructure(ptr,outobj);返回对象;}publicstaticintSizeOf(T结构){returnSizeOf();}publicstaticintSizeOf(){returnSizeOf(typeof(T));}publicstaticintSizeOf(Typet){returnSizeOfHelper_f(t,true);}}用法Guidg=Guid.NewGuid();intsize=InteropTools.SizeOf(g);IntPtrmem=Marshal.AllocHGlobal(size);InteropTools.StructureToPtr(refg,mem);Guidg2=互操作工具。PtrToStructure(内存);现在,它真的比Marshal类中的非泛型对象捕获方法有任何优势吗?看起来StructureToPtr花费的时间减少了大约80%,而PtrToStructure花费的时间减少了近95%。此外,这些方法可以正确处理可为null的类型。以上就是C#学习教程:Marshal.StructureToPtr分享的所有内容,不加装箱。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢