![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 2 Всего: 25 |
Вопрос, я уверен, легкий.
Кто-нибудь может подсказать или дать ссылку на статью, где подробно объяснено, как можно использовать классы, написанные на C++ в C#? Если есть исходники, но нельзя их просто переписать на шарп, ибо они еще используются в сишной программе ЗЫ. я не прошу давать ссылки на Рихтера и т.п., где расписано, что это возможно им сам механизм. Хотелось бы просто на примере все увидеть ![]() заранее спасибо ![]() Это сообщение отредактировал(а) Alek86 - 3.7.2007, 19:32 |
|||
|
||||
Naum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 743 Регистрация: 7.9.2005 Где: Саратов, ул. Поса дского, 298 Репутация: 8 Всего: 15 |
А что мешает скомпилять эти исходники в dll и потом в C# проект добавить референс на эту dll?
-------------------- У нас всего два праздника Новый год и ТЯПница. |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 2 Всего: 25 |
сразу предупрежу, что в программировании на .NET я опыта не имею.
![]() Если вы имеете в виду скомпилировать существующие классы в управляемый dll, то отвечу, что писались они на чистом C++ без рассчета на то, что будут использоваться в CLS (или как оно там ![]() Если же dll делать чисто виндовсчкий, то написанная на шарпе оболочка, насколько я понимаю, будет работать только под виндой, а всеь смысл - написать оболочку для ядра (представленного сишными классами), являющуюся кроссплатформенной. Вот и хотелось бы увидеть, как умные люди подобные проблемы решают ![]() |
|||
|
||||
stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 22 Всего: 48 |
сомневаюсь что в одном бинарном файле можно совместить результат работы двух комиляторов: C++ и C#. так что, в любом случае бинарный код C++ по отоношению к коду C# будет внешним, т.е. врапперов специфичных для платформы не избежать. как вариант - C++/CLI и ручками писать обёртки для всего, это позволит хотя бы совместить в одном файле реализацию на C++ и интерфейс для C#. мультиплатформенность в этом случае тоже под сомнением, компилятор C++/CLI, насколько я знаю, один и держит только Windows-среду.
з.ы. честно говоря, не улавливаю сути вопроса, код править нельзя, обёртки писать не желаем. кажется я знаю что подарить вам на новый год - волшебную палочку ![]() -------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 2 Всего: 25 |
как раз обертки писать и желаем.
идеальный вариант был бы примерно таков: на C++ для .NET написать обертки для C++ных классов, уже сделанных, и все это откомпилировать в дотнетовскую "dll" с управляемым кодом. Её уже можно использовать в шарпе (если я не ошибаюсь эта "dll" будет весьма кроссплатформенна ![]() Чтобы, если С++ные классы вдруг изменятся (а это более, чем возможно) в реализации (а не их вид), то нужно было просто перекомпилировать их в новую версию той "dll". Так что, получается, что вопрос немного изменился ![]() Можно ли это реализовать? Если можно, то можно ли дать ссылку на пример, а если нельзя то возможно ли сделать что либо подобное, чтобы не трогать именно С++ные классы (все остальное трогать можно ![]()
Если не ошибаюсь, у Рихтера написано как раз обратное... Он говорил, что в одной сборке можно использовать модули, написанные на разных языках Это сообщение отредактировал(а) Alek86 - 4.7.2007, 13:51 |
|||
|
||||
stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 22 Всего: 48 |
ещё раз: 1. такую сборку, на данный момент, можно откомпилировать одним единственным компилятором - компилятором от MS, входящим в состав VS2005. других компиляторов C++/CLI нет. 2. сборка содержит unmanaged (native) и managed код - реализацию классов на C++ и обёртки на C++/CLI. 3. компилятор от MS может собирать native код совместимый только с Windows. где вы тут увидели кроссплатформенность?
читайте внимательней - "в одном бинарном файле", модуль - отдельный бинарный файл. -------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 2 Всего: 25 |
да уж, наверное не стоит спорить, если я в этом мало что понимаю...
![]() и тогда последние "новичковские" вопросы 1. я читал, что, к примеру, шарп не может компилироваться в СLS, только если "внешние" классы не подходят к общим правилам. А внутренние - пожалуйста. Не значит ли это, что возможно откомпилировать классы, написанные на чистом Си++, как "внутренние" или типа того? А уже внешние - оберточные написать на С++/CLI? 2. если этого сделать нельзя, то зачем Си шарп везде рекламируют, как поддерживающий межьязыковую интеграцию и кроссплатформеность, если даже написанные на сях (его прямом родителе) классы нужно, для кроссплатформенности, переписывать? ЗЫ. Извиняюсь, если некоторые сокращения не точны. |
|||
|
||||
stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 22 Всего: 48 |
1. да, требования соответствия CLS применяются только к типам видимым вне сборки. я бы создал некоторый интерфейс взаимодействия между native кодом и managed частью (или использовал существующий), и отдельно скомпилировал код на C++, и отдельно обёртки на managed-языке. это как раз бы и был тот демпфер, который бы позволил в случае надобности портировать библиотеку.
2. C++ и C# из общего имеют только букву "C" в названии. -------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 2 Всего: 25 |
спасибо
![]() |
|||
|
||||
Scorched |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 24.6.2007 Репутация: нет Всего: 1 |
крос-какой? а что ms уже выпустили фреймворк для какой-то другой оси кроме винды?? и не выпустят. зачем им деньги терять? по сабжу. нужно твои с++ классы переписать на managed-с++. а иначе даже если напишешь какой-нибудь wrapper, все равно код останется unsafe и будет только под вин выполняться Это сообщение отредактировал(а) Scorched - 5.7.2007, 18:55 |
|||
|
||||
sTa1kEr |
|
|||
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: нет Всего: 146 |
Прошу прощенья, если сейчас сморожу чушь (в C++ я слабоват), но разве через [DllImport] нельзя получить доступ к unmanaged коду? Или кроссплатформенный C++ это нечто инное? И еще что такое CLS? Вот что мне выдал гугл по запросу CLS, вы точно не CLR имели ввиду?
|
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
AFAIK, как раз таки C++/CLI позволяет "честно" смешивать managed- и unmanaged-код.
-------------------- ![]() |
|||
|
||||
Alek86 |
|
||||||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 2 Всего: 25 |
вроде, есть такая штука, как Mono...
дело в том, что эти классы "внутри" иногда переписываются... и иногда весьма основательно. Остаются неизменными только "интерфейсы"
я предупреждал, что некоторые вокращения могу написать неточно ![]()
когда я задавал вопрос то наивно надеялся, что можно отктмпилить чистый Си++ в managed ![]()
![]() ![]() ![]() ЗЫ. может есть какая-то программка, которая переписывает с С++ на С++/CLI? вроде, для бейсика подорбная вещь существует... Это сообщение отредактировал(а) Alek86 - 6.7.2007, 10:28 |
||||||||||
|
|||||||||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Есть утилитка, создающая враппперы в автоматическом режиме - Swig называется. Её, помнится, использовали для переноса движка Ogre в дотнет -- были классы на С++ в отдельной длл, для них с пом. swig сгенерировали обёртку на шарпе. Хотя по сути внутри остался тот же P/Invoke, только видимость "прямого вызова функций и методов" из С++.
-------------------- ![]() |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |