Доброго времени суток,
возник небольшой вопрос при написании программы на C# (VS2005)
цель (начальная):
написать программу на C#, которая подгружает библиотеку на C++
и они используют структуры и классы для передачи данных
проблема:
в языках объекты представляются по-разному и так просто передать из программы в dll и обратно экземпляр класса или структуры достаточно сложно (но возможно)
мысли в сторону решения:
в локальном мсдн нашел решение такого типа: для шарпа:
[StructLayout(LayoutKind.Explicit)]
public struct Rect
{
[FieldOffset(0)] public int left;
[FieldOffset(4)] public int top;
[FieldOffset(8)] public int right;
[FieldOffset(12)] public int bottom;
}
для ++:
[StructLayout(LayoutKind::Explicit)]
value struct Rect
{
public:
[FieldOffset(0)]int left;
[FieldOffset(4)]int top;
[FieldOffset(8)]int right;
[FieldOffset(12)]int bottom;
};
а теперь вопрос:
как и каким образом все это совместить в программе на C# и dll на C++?
если у кого-нибудь есть немного времени, то прошу написать простенький пример реализации такого способа передачи данных через структуру и (или) класс
Здравствуйте, boxter, Вы писали:
B>а теперь вопрос: B>как и каким образом все это совместить в программе на C# и dll на C++? B>если у кого-нибудь есть немного времени, то прошу написать простенький пример реализации такого способа передачи данных через структуру и (или) класс
Никаким. Это из другой оперы.
Тебе нужно сделать одно из трех:
1. Оформить С++-код в виде autoamtion-совместимого COM-объекта и сгенерировать по его tlb обертку для C#.
2. Оформить С++-код в виде DLL экспортирующие только функции и POD-типы (то есть типы совместимые с С) и воспользоваться услугами PInvoke.
3. Воспользоваться МС++ для того чтобы на нем сделать управляемые классы-обертки предоставляющие доступк к неуправляемым типам.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, boxter, Вы писали:
B>>а теперь вопрос: B>>как и каким образом все это совместить в программе на C# и dll на C++?
VD>Никаким. Это из другой оперы.
VD>Тебе нужно сделать одно из трех: VD>1. Оформить С++-код в виде autoamtion-совместимого COM-объекта и сгенерировать по его tlb обертку для C#. VD>2. Оформить С++-код в виде DLL экспортирующие только функции и POD-типы (то есть типы совместимые с С) и воспользоваться услугами PInvoke. VD>3. Воспользоваться МС++ для того чтобы на нем сделать управляемые классы-обертки предоставляющие доступк к неуправляемым типам.
1. Что такое tlb обертка и как она делается?
2. Мне нужно использовать не только простые типы (типы С), но и структуры
притом передача осуществляется программой в dll-модуль, а модуль уже разбирается что там делать
3. Что такое MC++, как с ним работать и где про него можно прочитать
а теперь уточнение вопроса:
мне необходимо сделать программу на C#, которая использует dll-библиотеку на C++
притом, программа и dll-библиотека используют для передачи данных структуры и (или) классы
Здравствуйте, boxter, Вы писали:
B>1. Что такое tlb обертка и как она делается?
Что такое tlb ты в курсе? Если нет, значит с КОМ-ом ты не знаком. Тогда этот вариант может оказаться для тебя слишком сложным.
Если да, то tlb-рбертка это дотнетная сборка генерируемая утилитой tlbimp или просто при подключении к проекту КОМ-библиотеки содержащей tlb.
B>2. Мне нужно использовать не только простые типы (типы С), но и структуры B>притом передача осуществляется программой в dll-модуль, а модуль уже разбирается что там делать
Структуры вполне могут быть простыми типами. Главное чтобы они не содержали ссылон на классы и виртуальные методы.
B>3. Что такое MC++, как с ним работать и где про него можно прочитать
Менеджед расширение для С++. Рельно эдакий язык содержащий в себе обычное С++ и некоторое расширение позволяющее создавать умравляемые типы понятные для Шарпа.
На сегодня достуна вторая его версия значительно более продвинутая черм первая. Она носит загадочное название C++/CLI.
B>а теперь уточнение вопроса: B>мне необходимо сделать программу на C#, которая использует dll-библиотеку на C++ B>притом, программа и dll-библиотека используют для передачи данных структуры и (или) классы
Это и так понятно. Думаю я дал тебе общее понимание. Так что тебе нужно определиться с путем и поробовать его.
Кстати, есть еще один путь. Переписать все на Шарпе.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VD>Кстати, есть еще один путь. Переписать все на Шарпе.
дело в том, что условие такое, писать программу на C#, а библиотеку на С++
и все-таки может мне кто-нибудь написать простеникую программу и dll-библиотеку на этих языках (чтоб мне понять как осуществляется передача данных между языками)
Re[3]: программа на C# и dll на C++
От:
Аноним
Дата:
06.02.06 14:07
Оценка:
Marshal.PtrToStructure и Marshal.StructureToPtr могут помочь если неохота C++/CLI изучать
а желательно код сюда кинуть, а так могу только на примере avifil32.dll показать.
вот структура, находится в avifil32.dll, объявляем ее у себя в С# прогрмамме:
[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct BITMAPINFOHEADER {
public Int32 biSize;
public Int32 biWidth;
public Int32 biHeight;
public Int16 biPlanes;
public Int16 biBitCount;
public Int32 biCompression;
public Int32 biSizeImage;
public Int32 biXPelsPerMeter;
public Int32 biYPelsPerMeter;
public Int32 biClrUsed;
public Int32 biClrImportant;
}
теперь в с помощью DllImport можно структуру передать в dll :
[DllImport("avifil32.dll")]
public static extern int AVIStreamSetFormat(
IntPtr aviStream, Int32 lPos,
ref BITMAPINFOHEADER lpFormat, Int32 cbFormat);
Здравствуйте, EternalA, Вы писали:
EA>Marshal.PtrToStructure и Marshal.StructureToPtr могут помочь если неохота C++/CLI изучать
У меня просто голова уже идет кругом, чтобы связать ДЛЛ с шарпом. Если можете оказать помощь, то я опишу
проблему более подробно. Спасибо за ответ.
EA>данное сообщение получено с www.gotdotnet.ru EA>ссылка на оригинальное сообщение
Здравствуйте, boxter, Вы писали:
B>дело в том, что условие такое, писать программу на C#, а библиотеку на С++
B>и все-таки может мне кто-нибудь написать простеникую программу и dll-библиотеку на этих языках (чтоб мне понять как осуществляется передача данных между языками)
1. Приведи примеры функций, которые нужно будет вызывать из С++ DLL
2. Прочитай несколько статей с совершенно понятными названиями на этом ресурсе раздел Взаимодействие, конкретно статьи Взаимодействие с DLL
Здравствуйте, __kain, Вы писали:
__>Т.е. классы С++ без всяких оберток СОМ
А как быть в таком случае: у меня есть устройство с программным обеспечением, написанном на C++ (все, что я имею — это xxx.dll) и плохонькое описание (не назовешь даже руководством пользователя), где приведены сигнатуры методов и краткое описание, что выполняют эти методы. Вот как для этой ДЛЛ-ки создать обертку на C++/CLI, чтобы использовать в проекте на C#. Если можете объяснить, то, пожалуйста, поэтапно.
Здравствуйте, Гулько Виталий, Вы писали:
ГВ>Здравствуйте, __kain, Вы писали:
__>>Т.е. классы С++ без всяких оберток СОМ
ГВ>А как быть в таком случае: у меня есть устройство с программным обеспечением, написанном на C++ (все, что я имею — это xxx.dll) и плохонькое описание (не назовешь даже руководством пользователя), где приведены сигнатуры методов и краткое описание, что выполняют эти методы. Вот как для этой ДЛЛ-ки создать обертку на C++/CLI, чтобы использовать в проекте на C#. Если можете объяснить, то, пожалуйста, поэтапно.
Я же давал ссылки на пошаговое описание, неужели сложно почитать.
Здесь слишком много разных случаев, чтобы дать конкретный пример
Если вы приведете саму DLL и ее описание, я напишу.