Задача в pinvoke vector<struct> to C#
у меня есть проблема с пинвокингом вектора, содержащего struct в c#
я не маршал IntPtr к строке в структура
for (int i = 0; i < itemcount; i++) { var soft = items[i]; string x = Marshal.PtrToStringAuto( soft.DisplayName); }
пожалуйста помочь
Что я уже пробовал:
код на языке c++
typedef intptr_t ItemListHandle; bool GetPrograms(InstalledPrograms::ItemListHandle * hItems, Software** itemsFound, int* itemCount) { vector<Software>* lst = InstalledPrograms::GetInstalledPrograms(true); *hItems = reinterpret_cast<InstalledPrograms::ItemListHandle>(lst); *itemsFound = lst->data(); *itemCount = lst->size(); return true; }код c#
class ItemsSafeHandle : SafeHandleZeroOrMinusOneIsInvalid { public ItemsSafeHandle() : base(true){} protected override bool ReleaseHandle() { return Program.ReleaseItems(handle); } } [StructLayout(LayoutKind.Sequential)] public struct Software { public IntPtr DisplayName; public IntPtr InstallLocation; public IntPtr Version; public IntPtr Architecture; public IntPtr Icon; }; class Program { [DllImport(@"mydll.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "GetPrograms",CharSet =CharSet.Auto)] static unsafe extern bool GetPrograms(out ItemsSafeHandle itemsHandle, out Software* items, out int itemCount); [DllImport(@"mydll.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "ReleaseVectorItems", CharSet = CharSet.Auto)] public static unsafe extern bool ReleaseItems(IntPtr itemsHandle); static unsafe void Main(string[] args) { int itemcount = 0; Software* items; using (GenerateItemsWrapper( out items, out itemcount)) { for (int i = 0; i <itemcount; i++) { var soft = items[i]; string x = Marshal.PtrToStringAuto(soft.DisplayName); } } } static unsafe ItemsSafeHandle GenerateItemsWrapper(out Software* items, out int itemsCount) { ItemsSafeHandle itemsHandle; if (!GetPrograms(out itemsHandle, out items, out itemsCount)) { throw new InvalidOperationException(); } return itemsHandle; }
Richard MacCutchan
Вам нужно точно объяснить, в чем проблема.
Member 14087451
сэр, как вы можете видеть, программное обеспечение(struct) имеет члены intptr, которые я не могу преобразовать в строковые значения
honey the codewitch
можете ли вы дать нам заголовок C/C++ для импортируемой структуры?
Мне нужно увидеть нативные типы, чтобы получить вам правильный p/invoke
возможно, потребуется маршалировать stringbuilders или строки фиксированной длины внутри структуры или что-то в этом роде. это может быть что угодно. мне нужно увидеть собственный заголовок для структуры