Tag: marshalling

如何编组c#中的集合以传递给本机(C ++)代码

我正在进行企业应用程序开发。 整个应用程序是用c ++开发的,除了用c#开发的用户界面,现在是用c ++代码连接用户界面的时候了。 经过详细研究,我选择PInvoke才能这样做。 一切都很成功,我遇到的唯一情况就是如何将集合传递给C ++代码。 例如: C#侧码 List lst = new List(); lst.Add(“1”); lst.Add(“2”); lst.Add(“3”); lst.Add(“4”); C ++边码 std::vector vStr; 现在我如何将lst传递给本机C ++代码

编组C#结构为DX11 cbuffers

我有一些问题(我认为)在C#中打包我的结构并将它们传递给我在HLSL中注册的cbuffers。 当我以一种方式打包我的结构时,信息似乎能够传递到着色器: [StructLayout(LayoutKind.Explicit, Size = 16)] internal struct TestStruct { [FieldOffset(0)] public Vector3 mEyePosition; [FieldOffset(12)] public int type; } 当我创建这个结构并将其设置为我在C#中的常量缓冲区时,它似乎工作正常。 我得到了我期望的颜色: cbuffer PerFrame : register(b0) { Vector3 eyePos; int type; } float3 GetColour() { float3 returnColour = float(0.0f, 0.0f, 0.0f); switch(type) { case 0: returnColour = float3(1.0f, 0.0f, 0.0f); break; case 1: returnColour = float3(0.0f, […]

将动态大小数组编组到struct中

如何定义具有动态大小数组的结构? 这样对吗? struct MyStruc { public int len; [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=0)] public int buf[]; }

PInvoke:用C ++分配内存并在C#中释放它

我们正在使用PInvoke在C#和C ++之间进行交互。 我有一个如下的互操作结构,另一边有相同的布局C ++结构。 [StructLayout(LayoutKind.Sequential)] public struct MeshDataStruct : IDisposable { public MeshDataStruct(double[] vertices, int[] triangles , int[] surfaces) { _vertex_count = vertices.Length / 3; _vertices = Marshal.AllocHGlobal(_vertex_count*3*sizeof (double)); Marshal.Copy(vertices, 0, _vertices, _vertex_count); } // .. extract data methods to double[] etc. private IntPtr _vertices; private int _vertex_count; public void Dispose() { if (_vertices != […]

如何从GetTokenInformation()安全地为32位和64位拼接可变长度的结构数组? C#

我正在遵循这里提供的pinvoke代码,但稍微有点害怕可变长度数组的编组为size = 1,然后通过计算偏移量而不是索引到数组中来踩过它。 有没有更好的方法? 如果没有,我该怎么做才能使它对32位和64位安全? [StructLayout(LayoutKind.Sequential)] public struct SID_AND_ATTRIBUTES { public IntPtr Sid; public uint Attributes; } [StructLayout(LayoutKind.Sequential)] public struct TOKEN_GROUPS { public int GroupCount; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)] public SID_AND_ATTRIBUTES[] Groups; }; public void SomeMethod() { IntPtr tokenInformation; // … string retVal = string.Empty; TOKEN_GROUPS groups = (TOKEN_GROUPS)Marshal.PtrToStructure(tokenInformation, typeof(TOKEN_GROUPS)); int sidAndAttrSize = Marshal.SizeOf(new SID_AND_ATTRIBUTES()); […]

将非托管C ++指针转换为对象到托管C#对象

我有一个用C ++编写的非托管静态库(.dll): // This is a personal academic project. Dear PVS-Studio, please check it. // PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com #include “program.h” struct MyData { int32_t index; char* name; //uint8_t* data; }; extern “C” { __declspec(dllexport) MyData* GetMyData() { MyData* ms = new MyData(); ms->index = 5; ms->name = “Happy […]

我何时应该明确指定StructLayout?

我正在摆弄从C#调用DLL,并且需要定义我自己的结构。 很多文章强制结构的顺序布局 [StructLayout(LayoutKind.Sequential)] struct Foo … 所以,我按照套件,我的程序工作。 现在,当我把线路拿出来时,它仍然可以工作。 我为什么需要它?

Marshal.PtrToStringUni()vs new String()?

假设我有一个char *类型的指针到unicode字符串,我知道长度: char* _unmanagedStr; int _unmanagedStrLength; 我有2种方法将其转换为.NET字符串: Marshal.PtrToStringUni((IntPtr)_unmanagedStr, _unmanagedStrLength); 和 new string(_unmanagedStr, 0, _unmanagedStrLength); 在我的测试中,两个调用都给出了完全相同的结果,但new string()比Marshal.PtrToStringUni()快1.8倍。 为什么这种性能差异? 这两者之间还有其他function差异吗?

检查类型是否为blittable的最快方法?

在我的serialiser / deserialiser中,我有以下代码段: if (element_type.IsValueType && collection_type.IsArray) { try { GCHandle h = GCHandle.Alloc(array_object, GCHandleType.Pinned); int arrayDataSize = Marshal.SizeOf(element_type) * c.Count; var array_data = new byte[arrayDataSize]; Marshal.Copy(h.AddrOfPinnedObject(), array_data, 0, arrayDataSize); h.Free(); WriteByteArray(array_data); return; } catch (ArgumentException) { //if the value type is not blittable, then we need to serialise each array item one at a […]

marshal c struct to c#

有没有人可以在c#中编组这部分c / c ++代码? typedef struct { BYTE bCommandCode; BYTE bParameterCode; struct { DWORD dwSize; LPBYTE lpbBody; } Data; } COMMAND, *LPCOMMAND; 非常感谢