Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Интеграция С++ в шарп


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

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

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

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

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

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

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

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

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

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

Автор: Alek86 4.7.2007, 13:48
как раз обертки писать и желаем.

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

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

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


Цитата

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

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

Автор: stab 4.7.2007, 14:50
Цитата(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 Найти цитируемый пост)
Если не ошибаюсь, у Рихтера написано как раз обратное... Он говорил, что в одной сборке можно использовать модули, написанные на разных языках

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

Автор: Alek86 4.7.2007, 15:58
да уж, наверное не стоит спорить, если я в этом мало что понимаю... smile

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

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

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

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

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

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

Автор: Alek86 5.7.2007, 18:17
спасибо smile

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


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

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

Автор: sTa1kEr 6.7.2007, 00:57
Прошу прощенья, если сейчас сморожу чушь (в C++ я слабоват), но разве через [DllImport] нельзя получить доступ к unmanaged коду? Или кроссплатформенный C++ это нечто инное? И еще что такое CLS? Вот что мне выдал гугл по запросу http://www.google.com/search?q=CLS, вы точно не CLR имели ввиду?

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

Автор: Alek86 6.7.2007, 10:25
Цитата

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


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


Цитата

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


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

Цитата

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


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

Цитата

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


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

Цитата

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


 smile  smile  smile 


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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)