Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Интеграция С++ в шарп 
:(
    Опции темы
Alek86
Дата 3.7.2007, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 2
Всего: 25



Вопрос, я уверен, легкий.
Кто-нибудь может подсказать или дать ссылку на статью, где подробно объяснено, как можно использовать классы, написанные на C++ в C#? Если есть исходники, но нельзя их просто переписать на шарп, ибо они еще используются в сишной программе

ЗЫ. я не прошу давать ссылки на Рихтера и т.п., где расписано, что это возможно им сам механизм. Хотелось бы просто на примере все увидеть smile

заранее спасибо smile

Это сообщение отредактировал(а) Alek86 - 3.7.2007, 19:32


--------------------
user posted image    user posted image
PM MAIL   Вверх
Naum
Дата 4.7.2007, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 8
Всего: 15



А что мешает скомпилять эти исходники в dll и потом в C# проект добавить референс на эту dll?


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
Alek86
Дата 4.7.2007, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 2
Всего: 25



сразу предупрежу, что в программировании на .NET я опыта не имею. smile

Если вы имеете в виду скомпилировать существующие классы в управляемый dll, то отвечу, что писались они на чистом C++ без рассчета на то, что будут использоваться в CLS (или как оно там smile ). То есть нужна "прослойка" или еще что-то (что именно  - и есть мой вопрос)

Если же dll делать чисто виндовсчкий, то написанная на шарпе оболочка, насколько я понимаю, будет работать только под виндой, а всеь смысл - написать оболочку для ядра (представленного сишными классами), являющуюся кроссплатформенной.

Вот и хотелось бы увидеть, как умные люди подобные проблемы решают smile


--------------------
user posted image    user posted image
PM MAIL   Вверх
stab
Дата 4.7.2007, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



сомневаюсь что в одном бинарном файле можно совместить результат работы двух комиляторов: C++ и C#. так что, в любом случае бинарный код C++ по отоношению к коду C# будет внешним, т.е. врапперов специфичных для платформы не избежать. как вариант - C++/CLI и ручками писать обёртки для всего, это позволит хотя бы совместить в одном файле реализацию на C++ и интерфейс для C#. мультиплатформенность в этом случае тоже под сомнением, компилятор C++/CLI, насколько я знаю, один и держит только Windows-среду.

з.ы. честно говоря, не улавливаю сути вопроса, код править нельзя, обёртки писать не желаем. кажется я знаю что подарить вам на новый год - волшебную палочку  smile 


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Alek86
Дата 4.7.2007, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 2
Всего: 25



как раз обертки писать и желаем.

идеальный вариант был бы примерно таков:
на C++ для .NET написать обертки для C++ных классов, уже сделанных, и все это откомпилировать в дотнетовскую "dll" с управляемым кодом. Её уже можно использовать в шарпе (если я не ошибаюсь эта "dll" будет весьма кроссплатформенна smile ).
Чтобы, если С++ные классы вдруг изменятся (а это более, чем возможно) в реализации (а не их вид), то нужно было просто перекомпилировать их в новую версию той "dll".

Так что, получается, что вопрос немного изменился smile

Можно ли это реализовать? Если можно, то можно ли дать ссылку на пример, а если нельзя то возможно ли сделать что либо подобное, чтобы не трогать именно С++ные классы (все остальное трогать можно smile)


Цитата

сомневаюсь что в одном бинарном файле можно совместить результат работы двух комиляторов: C++ и C#.

Если не ошибаюсь, у Рихтера написано как раз обратное... Он говорил, что в одной сборке можно использовать модули, написанные на разных языках

Это сообщение отредактировал(а) Alek86 - 4.7.2007, 13:51


--------------------
user posted image    user posted image
PM MAIL   Вверх
stab
Дата 4.7.2007, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



Цитата(Alek86 @  4.7.2007,  17:48 Найти цитируемый пост)
на C++ для .NET написать обертки для C++ных классов, уже сделанных, и все это откомпилировать в дотнетовскую "dll" с управляемым кодом. Её уже можно использовать в шарпе (если я не ошибаюсь эта "dll" будет весьма кроссплатформенна smile ).

ещё раз: 1. такую сборку, на данный момент, можно откомпилировать одним единственным компилятором - компилятором от MS, входящим в состав VS2005. других компиляторов C++/CLI нет. 2. сборка содержит unmanaged (native) и managed код - реализацию классов на C++ и обёртки на C++/CLI. 3. компилятор от MS может собирать native код совместимый только с Windows. где вы тут увидели кроссплатформенность?


Цитата(Alek86 @  4.7.2007,  17:48 Найти цитируемый пост)
Если не ошибаюсь, у Рихтера написано как раз обратное... Он говорил, что в одной сборке можно использовать модули, написанные на разных языках

читайте внимательней - "в одном бинарном файле", модуль - отдельный бинарный файл.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Alek86
Дата 4.7.2007, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 2
Всего: 25



да уж, наверное не стоит спорить, если я в этом мало что понимаю... smile

и тогда последние "новичковские" вопросы

1.
я читал, что, к примеру, шарп не может компилироваться в СLS, только если "внешние" классы не подходят к общим правилам. А внутренние - пожалуйста.
Не значит ли это, что возможно откомпилировать классы, написанные на чистом Си++, как "внутренние" или типа того? А уже внешние - оберточные написать на С++/CLI?

2. 
если этого сделать нельзя, то зачем Си шарп везде рекламируют, как поддерживающий межьязыковую интеграцию и кроссплатформеность, если даже написанные на сях (его прямом родителе) классы нужно, для кроссплатформенности, переписывать?

ЗЫ. Извиняюсь, если некоторые сокращения не точны.


--------------------
user posted image    user posted image
PM MAIL   Вверх
stab
Дата 4.7.2007, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



1. да, требования соответствия CLS применяются только к типам видимым вне сборки. я бы создал некоторый интерфейс взаимодействия между native кодом и managed частью (или использовал существующий), и отдельно скомпилировал код на C++, и отдельно обёртки на managed-языке. это как раз бы и был тот демпфер, который бы позволил в случае надобности портировать библиотеку.

2. C++ и C# из общего имеют только букву "C" в названии.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Alek86
Дата 5.7.2007, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 2
Всего: 25



спасибо smile


--------------------
user posted image    user posted image
PM MAIL   Вверх
Scorched
Дата 5.7.2007, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 24.6.2007

Репутация: нет
Всего: 1



Цитата(Alek86 @  4.7.2007,  10:19 Найти цитируемый пост)
а всеь смысл - написать оболочку для ядра (представленного сишными классами), являющуюся кроссплатформенной.


крос-какой? а что ms уже выпустили фреймворк для какой-то другой оси кроме винды??
и не выпустят. зачем им деньги терять?

по сабжу. нужно твои с++ классы переписать на managed-с++. а иначе даже если напишешь какой-нибудь wrapper, все равно код останется unsafe и будет только под вин выполняться

Это сообщение отредактировал(а) Scorched - 5.7.2007, 18:55
PM MAIL   Вверх
sTa1kEr
Дата 6.7.2007, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: нет
Всего: 146



Прошу прощенья, если сейчас сморожу чушь (в C++ я слабоват), но разве через [DllImport] нельзя получить доступ к unmanaged коду? Или кроссплатформенный C++ это нечто инное? И еще что такое CLS? Вот что мне выдал гугл по запросу CLS, вы точно не CLR имели ввиду?
PM MAIL   Вверх
mr.DUDA
Дата 6.7.2007, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



AFAIK, как раз таки C++/CLI позволяет "честно" смешивать managed- и unmanaged-код.


--------------------
user posted image
PM MAIL WWW   Вверх
Alek86
Дата 6.7.2007, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 2
Всего: 25



Цитата

крос-какой? а что ms уже выпустили фреймворк для какой-то другой оси кроме винды??
и не выпустят. зачем им деньги терять?


вроде, есть такая штука, как Mono...


Цитата

по сабжу. нужно твои с++ классы переписать на managed-с++.


дело в том, что эти классы "внутри" иногда переписываются... и иногда весьма основательно. Остаются неизменными только "интерфейсы"

Цитата

И еще что такое CLS? Вот что мне выдал гугл по запросу CLS, вы точно не CLR имели ввиду?


я предупреждал, что некоторые вокращения могу написать неточно smile

Цитата

разве через [DllImport] нельзя получить доступ к unmanaged коду?


когда я задавал вопрос то наивно надеялся, что можно отктмпилить чистый Си++ в managed smile

Цитата

я бы создал некоторый интерфейс взаимодействия между native кодом и managed частью (или использовал существующий), и отдельно скомпилировал код на C++, и отдельно обёртки на managed-языке. это как раз бы и был тот демпфер, который бы позволил в случае надобности портировать библиотеку.


 smile  smile  smile 


ЗЫ. может есть какая-то программка, которая переписывает с С++ на С++/CLI?
вроде, для бейсика подорбная вещь существует... 

Это сообщение отредактировал(а) Alek86 - 6.7.2007, 10:28


--------------------
user posted image    user posted image
PM MAIL   Вверх
mr.DUDA
Дата 6.7.2007, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Есть утилитка, создающая враппперы в автоматическом режиме - Swig называется. Её, помнится, использовали для переноса движка Ogre в дотнет -- были классы на С++ в отдельной длл, для них с пом. swig сгенерировали обёртку на шарпе. Хотя по сути внутри остался тот же P/Invoke, только видимость "прямого вызова функций и методов" из С++.


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0885 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.