Лучший отвечающий
Отображение неуправляемых и управляемых типов

Вопрос
-
Здравствуйте. Не могли бы вы подсказать линки на четкие правила по каким законам происходит отображение неуправляемых типов на С в типы на С#. Я пишу вроппер для библиотеки на С и совсем запутался как правильно писать оболочки для С-шных структур. Или, например, не знаю как отображаются двойные указатели void**, не знаю что использовать вместо char[], char* - string или byte[] и т.д.
- Перемещено Siddharth Chavan 1 октября 2010 г. 21:54 MSDN Forums Consolidation (От:Visual C#)
22 октября 2009 г. 11:47
Ответы
-
На C# это можно определить так:
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct TColumn {
[MarshalAs(UnmanagedType.LPStr)]
public string filename;
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst=12)]
public string zcmptype;
}
[StructLayout(LayoutKind.Sequential)]
public struct FitsFile {
public System.IntPtr headstart;
public System.IntPtr tableptr;
}
- Dmitri Nesteruk- Помечено в качестве ответа OlegGel 24 октября 2009 г. 7:57
23 октября 2009 г. 21:20
Все ответы
-
По этому вопросы были статьи в журнале MSDN, сейчас они почему то не доступны..
Пока посмотрите данные ссылки, возможно там будет что то полезное касающееся вашего вопроса:
Creating a wrapper from c++ to c#
Calling Managed .NET C# COM Objects from Unmanaged C++ Code
Calling a C++ lib from C#
Call C/C++ CALLBACK DLL from C# (PInvoke? Wrapper class?)
How to create a wrapper
How to call functions in unmanaged C++ dll from C# app
Using a class defined in unmanaged c++ dll in c#
Creating a wrapper from c++ to c#23 октября 2009 г. 6:25 -
Да, написано-то там много, но вот ничего нет под конкретную ситуацию. В упрощенном виде С-определение структур выглядит так:
#define LONGLONG long long typedef struct { //... char* filename; //... char zcmptype[12]; }TColumn; typedef struct { //... LONGLONG* headstart; //... TColumn* tableptr; }FitsFile;
Как мне это определить на С#??
PS. Кста нашел, что если void** используется как параметр функции, то надо передавать ref IntPtr.23 октября 2009 г. 10:17 -
На C# это можно определить так:
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct TColumn {
[MarshalAs(UnmanagedType.LPStr)]
public string filename;
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst=12)]
public string zcmptype;
}
[StructLayout(LayoutKind.Sequential)]
public struct FitsFile {
public System.IntPtr headstart;
public System.IntPtr tableptr;
}
- Dmitri Nesteruk- Помечено в качестве ответа OlegGel 24 октября 2009 г. 7:57
23 октября 2009 г. 21:20 -
Ах вот оно что! Существует атрибут MarshalAsAttribute, который определяет как будет интерпретироваться тип. О его существовании я не знал. Спасибо - это работает.24 октября 2009 г. 7:57