Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Общие вопросы по .NET и C# > Интеграция С++ в шарп |
Автор: Alek86 3.7.2007, 19:30 |
Вопрос, я уверен, легкий. Кто-нибудь может подсказать или дать ссылку на статью, где подробно объяснено, как можно использовать классы, написанные на C++ в C#? Если есть исходники, но нельзя их просто переписать на шарп, ибо они еще используются в сишной программе ЗЫ. я не прошу давать ссылки на Рихтера и т.п., где расписано, что это возможно им сам механизм. Хотелось бы просто на примере все увидеть ![]() заранее спасибо ![]() |
Автор: Naum 4.7.2007, 08:21 |
А что мешает скомпилять эти исходники в dll и потом в C# проект добавить референс на эту dll? |
Автор: Alek86 4.7.2007, 10:19 |
сразу предупрежу, что в программировании на .NET я опыта не имею. ![]() Если вы имеете в виду скомпилировать существующие классы в управляемый dll, то отвечу, что писались они на чистом C++ без рассчета на то, что будут использоваться в CLS (или как оно там ![]() Если же dll делать чисто виндовсчкий, то написанная на шарпе оболочка, насколько я понимаю, будет работать только под виндой, а всеь смысл - написать оболочку для ядра (представленного сишными классами), являющуюся кроссплатформенной. Вот и хотелось бы увидеть, как умные люди подобные проблемы решают ![]() |
Автор: stab 4.7.2007, 11:19 |
сомневаюсь что в одном бинарном файле можно совместить результат работы двух комиляторов: C++ и C#. так что, в любом случае бинарный код C++ по отоношению к коду C# будет внешним, т.е. врапперов специфичных для платформы не избежать. как вариант - C++/CLI и ручками писать обёртки для всего, это позволит хотя бы совместить в одном файле реализацию на C++ и интерфейс для C#. мультиплатформенность в этом случае тоже под сомнением, компилятор C++/CLI, насколько я знаю, один и держит только Windows-среду. з.ы. честно говоря, не улавливаю сути вопроса, код править нельзя, обёртки писать не желаем. кажется я знаю что подарить вам на новый год - волшебную палочку ![]() |
Автор: Alek86 4.7.2007, 13:48 | ||
как раз обертки писать и желаем. идеальный вариант был бы примерно таков: на C++ для .NET написать обертки для C++ных классов, уже сделанных, и все это откомпилировать в дотнетовскую "dll" с управляемым кодом. Её уже можно использовать в шарпе (если я не ошибаюсь эта "dll" будет весьма кроссплатформенна ![]() Чтобы, если С++ные классы вдруг изменятся (а это более, чем возможно) в реализации (а не их вид), то нужно было просто перекомпилировать их в новую версию той "dll". Так что, получается, что вопрос немного изменился ![]() Можно ли это реализовать? Если можно, то можно ли дать ссылку на пример, а если нельзя то возможно ли сделать что либо подобное, чтобы не трогать именно С++ные классы (все остальное трогать можно ![]()
Если не ошибаюсь, у Рихтера написано как раз обратное... Он говорил, что в одной сборке можно использовать модули, написанные на разных языках |
Автор: Alek86 4.7.2007, 15:58 |
да уж, наверное не стоит спорить, если я в этом мало что понимаю... ![]() и тогда последние "новичковские" вопросы 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 |
спасибо ![]() |
Автор: Scorched 5.7.2007, 18:52 | ||
крос-какой? а что 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 | ||||||||||
вроде, есть такая штука, как Mono...
дело в том, что эти классы "внутри" иногда переписываются... и иногда весьма основательно. Остаются неизменными только "интерфейсы"
я предупреждал, что некоторые вокращения могу написать неточно ![]()
когда я задавал вопрос то наивно надеялся, что можно отктмпилить чистый Си++ в managed ![]()
![]() ![]() ![]() ЗЫ. может есть какая-то программка, которая переписывает с С++ на С++/CLI? вроде, для бейсика подорбная вещь существует... |
Автор: mr.DUDA 6.7.2007, 20:21 |
Есть утилитка, создающая враппперы в автоматическом режиме - Swig называется. Её, помнится, использовали для переноса движка Ogre в дотнет -- были классы на С++ в отдельной длл, для них с пом. swig сгенерировали обёртку на шарпе. Хотя по сути внутри остался тот же P/Invoke, только видимость "прямого вызова функций и методов" из С++. |