大佬教程收集整理的这篇文章主要介绍了获取从本机dll到c#应用程序的结构数组,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
如何从原生DLL到C#项目获取表?以下是我现在所拥有的.
// in C# .NET 2.0 CF project [StructLayout(LayoutKind.Sequential)] public struct TableEntry { [MarshalAs(UnmanagedType.LPWStr)] public string description; public int item; public int another_item; public IntPtr some_data; } [DllImport("MyDll.dll",CallingConvention = CallingConvention.Winapi,CharSet = CharSet.Auto)] public static extern bool GetTable(ref TableEntry[] table); SomeFunction() { TableEntry[] table = null; bool success = GetTable( ref table ); // at this point,the table is empty } // In Native C++ DLL std::vector< TABLE_ENTRY > global_dll_table; extern "C" __declspec(dllexport) bool GetTable( TABLE_ENTRY* table ) { table = &global_dll_table.front(); return true; }
谢谢,
PaulH
>在托管代码中将数组键入IntPtr
>让本机代码返回数组和size参数.
>手动将IntPtr中的数据封送到托管端的自定义结构.
因此,我会对您的代码进行以下更改.
本机:
extern "C" __declspec(dllexport) bool GetTable( TABLE_ENTRY** table,__int32* pSize ) { *table = &global_dll_table.front(); *pSize = static_cast<int32>(global_dll_table.size()); return true; }
管理:
[DllImport("MyDll.dll",CharSet = CharSet.Auto)] [return: MarshalAs(UnmanagedType.I1)] public static extern bool GetTable(out IntPtr arrayPtr,out int size); public static List<TableEntry> GetTable() { var arrayValue = IntPtr.Zero; var size = 0; var list = new List<TableEntry>(); if ( !GetTable(out arrayValue,out size)) { return list; } var tableEntrySize = Marshal.SizeOf(typeof(TableEntry)); for ( var i = 0; i < size; i++) { var cur = (TableEntry)Marshal.PtrToStructure(arrayValue,typeof(TableEntry)); list.Add(cur); arrayValue = new IntPtr(arrayValue.ToInt32() + tableEntrySize); } return list; }
以上是大佬教程为你收集整理的获取从本机dll到c#应用程序的结构数组全部内容,希望文章能够帮你解决获取从本机dll到c#应用程序的结构数组所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。