Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Управляемые типы в native длл-ке

5.1K
23 июня 2010 года
Karrde
88 / / 15.10.2007
Доброго времени суток всем. Возникла интересная(по крайней мере для меня) проблема. Существует длл-ка, написанная на native c++, в функции которой в качестве параметров посылаются структуры, содержащие другие структуры и тд)) Я хочу все структуры перебить на управляемый код(в c++/cli) и уже их использовать в качестве параметров. Как это правильно реализовать? По идее, надо сделать так, чтобы итоговая последовательность байт управляемого класса полностью соответствовала последовательности байт изначальной структуры. Пытался вместо структур объявлять ref class, но функция выдала ошибку
5
23 июня 2010 года
hardcase
4.5K / / 09.08.2005
И в чем вопрос?
Объявляем соответствующий struct и навешиваем атрибут StuctLayoutAttribute с аргументом LayoutKind.Sequential или LayoutKind.Explicit, во втором случае нужно будет для каждого поля указывать смещение атрибутом FieldOffsetAttribute.
Функции из DLL вызывать через PInvoke.
5.1K
23 июня 2010 года
Karrde
88 / / 15.10.2007
Да, согласен)) Спасибо). нашел тут статью. Но дополнительный вопрос есть. Допустим, в native-структуре объявлен массив типа char Data[1500].
Т.е. его аналог в управляемой структуре:
static array<System::Byte>^ Data = gcnew array<System::Byte>(1500) ?
Ведь в cli нельзя объявлять что-то типа array<System::Byte> Data[1500], а для нестатического массива можно только объявить дескриптор array<System::Byte>^ Data, под который не будет выделено необходимые нам 1500 байт))
5
23 июня 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: Karrde
Допустим, в native-структуре объявлен массив типа char Data[1500].
Т.е. его аналог в управляемой структуре:


 
Код:
[StuctLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
struct X {

  [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1500)]
  public string Data;

}
5
23 июня 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: Karrde

static array<System::Byte>^ Data = gcnew array<System::Byte>(1500) ?
Ведь в cli нельзя объявлять что-то типа array<System::Byte> Data[1500], а для нестатического массива можно только объявить дескриптор array<System::Byte>^ Data, под который не будет выделено необходимые нам 1500 байт))

В unsafe структурах в C# - можно. Как в MC++ - не ведаю.

341
24 июня 2010 года
Der Meister
874 / / 21.12.2007
Мне кажется, чем совершать сей великий труд по трансляции пива в чебуреки, проще сделать управляемый API над вашей DLL и похорнить неуправляемые структуры в его недрах.
5.1K
26 июня 2010 года
Karrde
88 / / 15.10.2007
мдя, в итоге подумал, что такую разнородную кучу структур переводить в управляемый код будет долго и муторно)) и решил, раз уж пишу на cli, то можно и эти неуправляемые структуры оставить. Спасибо, по крайней мере начал разбираться с PInvoke
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог