C# & C++
От: boxter Россия  
Дата: 05.02.06 19:10
Оценка:
Доброго времени суток,
возник небольшой вопрос при написании программы на 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++?
если у кого-нибудь есть немного времени, то прошу написать простенький пример реализации такого способа передачи данных через структуру и (или) класс

заранее спасибо
Re: C# & C++
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.02.06 22:15
Оценка:
Здравствуйте, 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>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: программа на C# и dll на C++
От: boxter Россия  
Дата: 06.02.06 06:26
Оценка:
Здравствуйте, 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-библиотека используют для передачи данных структуры и (или) классы
Re[3]: программа на C# и dll на C++
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.02.06 10:44
Оценка:
Здравствуйте, 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>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: программа на C# и dll на C++
От: boxter Россия  
Дата: 06.02.06 14:58
Оценка:
VD>Кстати, есть еще один путь. Переписать все на Шарпе.

дело в том, что условие такое, писать программу на C#, а библиотеку на С++

и все-таки может мне кто-нибудь написать простеникую программу и dll-библиотеку на этих языках (чтоб мне понять как осуществляется передача данных между языками)
Re[3]: программа на C# и dll на C++
От: Аноним  
Дата: 06.02.06 14:07
Оценка: :)
Marshal.PtrToStructure и Marshal.StructureToPtr могут помочь если неохота C++/CLI изучать


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[4]: программа на C# и dll на C++
От: Аноним  
Дата: 06.02.06 16:14
Оценка:
а желательно код сюда кинуть, а так могу только на примере 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);



данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[4]: программа на C# и dll на C++
От: Павел Кузнецов  
Дата: 07.02.06 01:21
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Кстати, есть еще один путь. Переписать все на Шарпе.


Или на C++/CLI
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[4]: программа на C# и dll на C++
От: Гулько Виталий Украина  
Дата: 18.03.09 14:24
Оценка:
Здравствуйте, EternalA, Вы писали:

EA>Marshal.PtrToStructure и Marshal.StructureToPtr могут помочь если неохота C++/CLI изучать

У меня просто голова уже идет кругом, чтобы связать ДЛЛ с шарпом. Если можете оказать помощь, то я опишу
проблему более подробно. Спасибо за ответ.

EA>
данное сообщение получено с www.gotdotnet.ru

EA>ссылка на оригинальное сообщение
Re[5]: программа на C# и dll на C++
От: Camarada Россия  
Дата: 18.03.09 18:10
Оценка:
Здравствуйте, boxter, Вы писали:

B>дело в том, что условие такое, писать программу на C#, а библиотеку на С++


B>и все-таки может мне кто-нибудь написать простеникую программу и dll-библиотеку на этих языках (чтоб мне понять как осуществляется передача данных между языками)


1. Приведи примеры функций, которые нужно будет вызывать из С++ DLL
2. Прочитай несколько статей с совершенно понятными названиями на этом ресурсе раздел Взаимодействие, конкретно статьи Взаимодействие с DLL
Автор(ы): Алексей Дубовцев
Дата: 22.10.2001
, Взаимодействие .NET с неуправляемым кодом
Автор(ы): Алифанов Андрей
Дата: 15.02.2002
В статье рассматриваются вопросы взаимодействия программ, написанных на CLR-совместимых языках с неуправляемым кодом: с функциями Win32 API и COM-серверами.


Если приведешь код экспортируемых из DLL фунций, здесь скажут как их вызвать из C#.
Re[2]: C# & C++
От: __kain Россия  
Дата: 19.03.09 14:37
Оценка:
Здравствуйте, VladD2, Вы писали:

Можно и С++ из dll дергать — CallingConvention.ThisCall недаром придумали
Re[3]: C# & C++
От: __kain Россия  
Дата: 19.03.09 14:38
Оценка:
Т.е. классы С++ без всяких оберток СОМ
Re[4]: C# & C++
От: Гулько Виталий Украина  
Дата: 20.03.09 12:43
Оценка:
Здравствуйте, __kain, Вы писали:

__>Т.е. классы С++ без всяких оберток СОМ


А как быть в таком случае: у меня есть устройство с программным обеспечением, написанном на C++ (все, что я имею — это xxx.dll) и плохонькое описание (не назовешь даже руководством пользователя), где приведены сигнатуры методов и краткое описание, что выполняют эти методы. Вот как для этой ДЛЛ-ки создать обертку на C++/CLI, чтобы использовать в проекте на C#. Если можете объяснить, то, пожалуйста, поэтапно.
Re[5]: C# & C++
От: Camarada Россия  
Дата: 22.03.09 11:27
Оценка:
Здравствуйте, Гулько Виталий, Вы писали:

ГВ>Здравствуйте, __kain, Вы писали:


__>>Т.е. классы С++ без всяких оберток СОМ


ГВ>А как быть в таком случае: у меня есть устройство с программным обеспечением, написанном на C++ (все, что я имею — это xxx.dll) и плохонькое описание (не назовешь даже руководством пользователя), где приведены сигнатуры методов и краткое описание, что выполняют эти методы. Вот как для этой ДЛЛ-ки создать обертку на C++/CLI, чтобы использовать в проекте на C#. Если можете объяснить, то, пожалуйста, поэтапно.


Я же давал ссылки на пошаговое описание, неужели сложно почитать.

Здесь слишком много разных случаев, чтобы дать конкретный пример
Если вы приведете саму DLL и ее описание, я напишу.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.