Tag: marshalling

不正确的编组:C#数组到C ++非托管数组

我有以下C#代码,其中包含结构定义(CInput),obj定义和init,以及对C ++(本机)DLL函数的调用(也是由我编写的)。 //C# code public struct CInput { [MarshalAsAttribute(UnmanagedType.R8)] public double Time; [MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_R8)] public double[] Database; /* other similar fields*/ } CInput Inputs = new CInput(); /* init of Inputs fields*/ int bfr = Example(ref Inputs); //’Example’ being the C++ DLL call Messagebox.Show(bfr.ToString()); 编组第二个参数时出错,我不知道在哪里。 然后: //C++ code struct CInput { double Time; […]

AppDomains之间的通信

我们正在构建一个应用程序(WinForms,.NET 3.5),它将“插件”DLL加载到辅助AppDomain中。 辅助AppDomain需要偶尔与第一个AppDomain通信(更具体地说,从主AppDomain中创建的对象调用或获取数据)。 我已经阅读了有关AppDomains的大部分内容以及它们之间的通信。 到目前为止,我见过的唯一简单的解决方案是从MarshalByRefObjectinheritance并将TransparentProxy传递到第二个AppDomain,在Proxy上调用方法。 此方法有其缺点(例如,在框架类型的情况下,或者从已经从其他类inheritance的类型,静态字段/类等等,并不总是可以从MBROinheritance)。 由于当前的通信点非常不变(只有2-3个需要通信的场景),我考虑创建一个具有以下属性的简单Mediator类: 将在1st(Main)AppDomain中创建。 只能作为主要AppDomain中创建的“Real”对象的“消息传递器”。 将inheritance自MBRO,并将其代理引用发送到第二个AppDomain。 将调用此代理对象上的方法,然后调用第一个AppDomain中“真实”对象上的方法。 我的问题 – 这看起来像是一个逻辑设计吗? 更重要的是,WCF或任何其他通信框架中是否已存在调解器/消息传递器类? 它似乎是一个通用的概念,我想知道是否有类似的东西。

如何编组指向结构指针数组的指针?

我有一个带有以下签名的C函数: int my_function(int n, struct player **players) players是一个指向struct player对象指针数组的指针。 n是数组中指针的数量。 该函数不修改数组也不修改结构的内容,并且在返回后不保留任何指针。 我尝试了以下方法: [DllImport(“mylibary.dll”)] static extern int my_function(int n, [In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] player_in []players); 但是,它将数据编组为指向结构数组的指针,而不是指向结构指针数组的指针。

C#编组来自C ++ DLL的double *?

我有一个带有导出函数的C ++ DLL: extern “C” __declspec(dllexport) double* fft(double* dataReal, double* dataImag) { […] } 该函数计算两个双数组(实数和虚数)的FFT,返回单个双数组,实数为虚数组件交错:{Re,Im,Re,Im,…} 我不知道如何在C#中调用此函数。 我在做的是: [DllImport(“fft.dll”)] static extern double[] fft(double[] dataReal, double[] dataImag); 当我像这样测试它: double[] foo = fft(new double[] { 1, 2, 3, 4 }, new double[] { 0, 0, 0, 0 }); 我收到MarshalDirectiveExceptionexception: 无法封送“返回值”:无效的托管/非托管类型组合。 我假设这是因为C ++ double*与C# double[]不完全相同,但我不确定如何修复它。 有任何想法吗? 编辑:我已经更改了签名,以便我现在传递一些额外的信息: extern “C” […]

如何编组指向结构数组指针的指针?

我的C声明如下: int myData(uint myHandle, tchar *dataName, long *Time, uint *maxData, DATASTRUCT **data); typedef struct { byte Rel; __int64 Time; char Validated; unsigned char Data[1]; } DATASTRUCT ; 我的C#声明如下: [DllImport(“myData.dll”, EntryPoint = “myData”)] public static extern int myData(uint myHandle, [MarshalAs(UnmanagedType.LPTStr)] string dataName, out long Time, out uint maxData, ref DATASTRUCT[] data); [StructLayout(LayoutKind.Sequential, Pack = 1)] public […]

如何将wchar_t *从C ++编组为C#作为out参数或返回值?

我试图在很多方面做到这一点,但没有一个是有效的。 有人有一个正确的例子吗? 我只想将wchar_t*值从函数移动到C#级别。

如何将vector 从C ++ dll编组到C#应用程序?

我有一个C ++函数,它产生一个有趣的矩形列表。 我希望能够从C ++库中获取该列表并返回到调用它的C#应用​​程序。 到目前为止,我正在编码矩形,如下所示: struct ImagePatch{ int xmin, xmax, ymin, ymax; } 然后编码一些向量: void MyFunc(…, std::vector& rectanglePoints){ std::vector patches; //this is filled with rectangles for(i = 0; i < patches.size(); i++){ rectanglePoints.push_back(patches[i].xmin); rectanglePoints.push_back(patches[i].xmax); rectanglePoints.push_back(patches[i].ymin); rectanglePoints.push_back(patches[i].ymax); } } 用于与C#交互的标题看起来像(并且适用于许多其他函数): extern “C” { __declspec(dllexport) void __cdecl MyFunc(…, std::vector& rectanglePoints); } 是否有一些关键字或其他我可以做的东西来取出那组矩形? 我发现这篇文章是用于在C#中编组对象,但它看起来太复杂了,太过于缺乏解释。 整数向量是正确的方法,还是有其他技巧或方法?

从IntPtr获取struct数组

我有一些像这样的结构 struct MyStruct { public int field1; public int field2; public int field3; } 我有指向此结构数组的指针。 所以,我需要从这个指针获取数组。 我试图使用Marshal.PtrToStructure,但我有内存读取错误。 这是我的方法: public MyStruct[] GetArrayOfStruct(IntPtr pointerToStruct, int length) { var sizeInBytes = Marshal.SizeOf(typeof(TCnt)); MyStruct[] output = new MyStruct[length]; for (int i = 0; i < length; i++) { IntPtr p = new IntPtr((pointerToStruct.ToInt32() + i * sizeInBytes)); output[i] = […]

IntPtr到字节数组和返回

引用如何从C#中的byte []获取IntPtr 我试图读取IntPtr引用到byte []然后再返回另一个IntPtr的数据。 指针正在引用从扫描仪设备捕获的图像,因此我还假设捕获此信息应放入字节数组中。 我也不确定Marshal.SizeOf()方法是否会返回IntPtr引用的数据大小或指针本身的大小。 我的问题是我收到错误“类型’System.Byte []’无法编组为非托管结构;无法计算有意义的大小或偏移量” IntPtr bmpptr = Twain.GlobalLock (hImage); try { byte[] _imageTemp = new byte[Marshal.SizeOf(bmpptr)]; Marshal.Copy(bmpptr, _imageTemp, 0, Marshal.SizeOf(bmpptr)); IntPtr unmanagedPointer = Marshal.AllocHGlobal( Marshal.SizeOf(_imageTemp)); try { Marshal.Copy(_imageTemp, 0, unmanagedPointer, Marshal.SizeOf(_imageTemp)); Gdip.SaveDIBAs( string.Format(“{0}\\{1}.{2}”, CaptureFolder, “Test”, “jpg”), unmanagedPointer, false); } finally { Marshal.FreeHGlobal(unmanagedPointer); } } catch (Exception e) { Scanner.control.Test = e.Message; […]

我如何GetCustomAttributes?

我使用2.0框架尝试了以下代码,然后我得到一个属性,但是当我在紧凑框架上尝试这个时,它总是返回一个空数组。 MSDN文档说它支持,我做错了什么? Test x = new Test(); FieldInfo field_info = x.GetType().GetField(“ArrayShorts”); object[] custom_attributes = field_info.GetCustomAttributes(typeof(MarshalAsAttribute), false); [StructLayout(LayoutKind.Sequential)] public struct Test { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public ushort[] ArrayShorts; }