Форум программистов, компьютерный форум, киберфорум
C++/CLI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
325 / 304 / 173
Регистрация: 16.11.2010
Сообщений: 1,069
Записей в блоге: 9
1

C++ CLI после C# и C++

19.02.2017, 17:59. Показов 2282. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Несколько лет программировал на C# и не знал бед, пока не появилась задача скрыть некоторые функции по посторонних глаз (рефлектор, IlSpy и т д). Перебрав несколько вариантов, подумал остановиться на C++ CLI, т.к. в нем можно делать нативные вставки обычного С++.

Т.к. куча кода у меня на C# решил пойти таким путем: перенести все на C++ CLi. Прочитал про отличия в прикрепленной к этой ветке теме про Основные отличия C# от C++ CLI и приступил...

Но тут же столкнулся с некоторыми вопросами:
1) Носит скорее теоретический характер: вроде как по умолчанию считается, что все объекты, массивы и тип стринг в C# передаются по ссылке. Почему при декомпиляции через рефлектор в VС++ все эти ссылочные типы предстают в виде управляемых указателей с пометкой ^ вместо скажем принятой в C++ CLI управляемой ссылки % ? Пришел к выводу, что ссылка - это в принципе тот же указатель, но с меньшими возможностями (если взять классический C++). Но все же какое-то ощущение не совсем равенства между ними остались:
C#
1
private void button1_Click(object sender, EventArgs e)
и
C++
1
void button1_Click(System::Object^ sender, System::EventArgs^ e)
2) Visual Studio 2010. В среде разработки C# и VB.NET замечательные функции всплывающих подсказок: это и выпадающие списки с методами и свойствами экз. класса и всплывающие подсказки о назначении тех или иных методов библиотеки .net при наведении курсора, так же сразу же выскакивают уведомления о синтаксических ошибках, если они есть и даже предупреждения, например, если где-то в коде есть неиспользуемая переменная. Если открыть обычный проект С++, не CLI, то там это тоже есть, но реализовано куда слабее. Но когда в этой же студии я создаю проект С++CLI, то у меня возникает впечатление, что я программирую в блокноте. Нет не только подсказок, но даже указания на явно синтаксические ошибки. Они выявляются только на этапе построения. Вопрос: это у всех так или только у меня? Может быть что-то нужно включить в настройках, чтобы это появилось?
Если же этого нет, то как так? Получается, что Майкрософт не развивает эту среду?

3) И третий вопрос у меня касается структур. В C# они имеют тип значение. Значит, живут в стеке. Что касается классического C++, то почти везде пишут, что структуры - это те же классы, только поля видимости у них по умолчанию public. То есть по идее они живут в куче. А структуры (управляемые) в C++ CLI передаются по ссылке(живут в куче) или по значению(в стеке)?

4) Оч. важно, т.к. для меня вообще не понятен такой код, но оч важен:
C++
1
2
3
4
5
6
   this->MAP-> += (IDelegateCreateExpression NYI);
    this->MAP-> += (IDelegateCreateExpression NYI);
    this->MAP-> += (IDelegateCreateExpression NYI);
    this->MAP-> += (IDelegateCreateExpression NYI);
    this->MAP-> += (IDelegateCreateExpression NYI);
    this->MAP-> += (IDelegateCreateExpression NYI);
Получил его с помощью Адд-Ин для CLI c++ в рефлектор, дизассемблив свою прогу
Его аналог на C#
C#
1
2
3
4
5
6
    this.MAP.Paint += new PaintEventHandler(this.MAP_Paint);
    this.MAP.MouseDown += new MouseEventHandler(this.MAP_MouseDown);
    this.MAP.MouseEnter += new EventHandler(this.MAP_MouseEnter);
    this.MAP.MouseMove += new MouseEventHandler(this.MAP_MouseMove);
    this.MAP.MouseWheel += new MouseEventHandler(this.MAP_MouseWheel);
    this.MAP.PreviewKeyDown += new PreviewKeyDownEventHandler(this.MAP_PreviewKeyDown);
Was ist das? Что это за IDelegateCreateExpression и как он работает? Как он вообще узнает, какой делегат нужно добавить? Он что, универсальный?

0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.02.2017, 17:59
Ответы с готовыми решениями:

Изучение C++/CLI после С++
Добрый день! Разумно ли будет приступать к изучению C++/CLI после чистого С++ ? Пригодятся...

C# to C++/CLI
Есть вот такой код на C# public static IControlSystem proxy; public static int clientID =...

c# ->c++/cli
foreach (KeyValuePair<string, string> pair in words) { source = source.Replace(pair.Key,...

CLI
Спецификфация CLI. Чем она представлена в C#? Если можно подробнее? На экзамене надо бла-бла-бла...

7
325 / 304 / 173
Регистрация: 16.11.2010
Сообщений: 1,069
Записей в блоге: 9
21.04.2017, 09:56  [ТС] 2
В общем раз никто не ответил, сам отвечу на свои вопросы как я их понял по истечению времени:
1) В С++ все построено на указателях. Это философия этого языка. Знака равенства между кодом C# и C++cli нет. Вообще в с++ делает явное разграничение в синтаксисе между обращениями к пространству имен либо статическому члену, обращением к экземпляру класса (или структуры) и обращением к экземпляру класса через указатель ("::","." и "->" соответственно). Тогда как в C# все делается через ".". Что это дает c++-шному программисту? По большому счету понимание. В C# даже если и знаешь, то все же редко задумываешься о том, по ссылке или по значению передается переменная. В практическом же смысле плюсов я не заметил.
2)Глюк VS2010. Его недоработка. Странная оплошность. О ней даже в русскоязычной вики написано, вроде там есть и какое-то решение... Но я перешел на VS2015, чтобы не томить судьбу. Впрочем и там автоподстановка в C++ cli все же сильно уступает C#, что заметно затрудняет (растягивает во времени) написание кода
3)Вопрос отпал, пока не пользовался структурами. Возможно все зависит от ключевого слова ref, но я не пробовал
4)Гугл был немногословен. Он выдал 3-4 ссылки на англоязычные ресурсы без комментариев. И все. На одном из них был пример кода с использованием подобных вещей. Все, что я понял, что там подключается какая-то сторонняя UML библиотека непонятного происхождения, поиск которой ничего не дал. Я не силен в UML и не стал искать дальше.
В общем может кому пригодится события в с++ cli определяются примерно так:
C++
1
this->Load += gcnew System::EventHandler(this, &frmMain::frmMain_Load);
Увы, нету такой красивой автоподстановки, как в C#
И еще момент, по поводу смешения кодов: в неуправляемом классе можно обращаться к библиотекам .net и использовать управляемые классы. Но на это
C++
1
this->Load += gcnew System::EventHandler(this, &frmMain::frmMain_Load);
студия заругалась на &frmMain::frmMain_Load, якобы что класс frmMain, в котором реализовано событие frmMain_Load должен быть управляемым и никак не наоборот. Учитывайте это при разработке. Но это уже совсем другая история...
2
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
22.04.2017, 20:40 3
netBool, много полезного есть в подзаголовке этого раздела с названием: "важные темы":
Преобразование между типами System::String, char*, wchar_t*, std::string и др.
Коллекция полезных исходников, трюков и хаков C++/CLI
Основные отличия C# от C++ CLI
Создание, заполнение и управление динамическими массивами
0
325 / 304 / 173
Регистрация: 16.11.2010
Сообщений: 1,069
Записей в блоге: 9
23.04.2017, 17:00  [ТС] 4
Цитата Сообщение от IGPIGP Посмотреть сообщение
netBool, много полезного есть в подзаголовке этого раздела с названием: "важные темы":
Их я прочитал прежде всего. Но там не были освещены эти вопросы достаточно подробно. Решил написать... Вообще тема C++ CLI в интернете мало освещена, в мсдн для него много раскрытых тем, хотя они есть для C# и VB.
Например, нигде я не находил информации о том, что .NET в C++ урезан. И то, к чему я привык на C# нельзя в C++. Даже тот же ToString(). Приходится все делать через Convert::ToString(...). Хотя автоподстановка под неработающие функции существует, что еще больше путает. Так же не работают некоторые перегрузки функций.
При чем у меня VS2015, последняя
0
Администратор
Эксперт .NET
17022 / 13374 / 5218
Регистрация: 17.03.2014
Сообщений: 27,351
Записей в блоге: 1
23.04.2017, 17:35 5
Цитата Сообщение от netBool Посмотреть сообщение
Например, нигде я не находил информации о том, что .NET в C++ урезан. И то, к чему я привык на C# нельзя в C++. Даже тот же ToString()
Да ладно. В какой именно ситуации ToString() недоступен?
1
325 / 304 / 173
Регистрация: 16.11.2010
Сообщений: 1,069
Записей в блоге: 9
23.04.2017, 18:26  [ТС] 6
Да ладно. В какой именно ситуации ToString() недоступен?
Вот так почему-то не вышло, хотя автоподстановка ToString увидела и подставила, но при компиляции студия выдала, что ToString не является членом класса
C++
1
DateTime::Now::ToString()
0
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
23.04.2017, 18:45 7
Цитата Сообщение от netBool Посмотреть сообщение
Их я прочитал прежде всего. Но там не были освещены эти вопросы достаточно подробно. Решил написать...
Там есть почти всё о чем Вы пишете, но подробнее.
Вызывать метод нужно на указателе на объект:
C++
1
2
System::DateTime^ dt =System::DateTime::Now;
                 this->label1->Text=dt->ToString();
0
322 / 174 / 78
Регистрация: 09.10.2014
Сообщений: 809
06.06.2017, 16:09 8
Цитата Сообщение от netBool Посмотреть сообщение
Вот так почему-то не вышло, хотя автоподстановка ToString увидела и подставила, но при компиляции студия выдала, что ToString не является членом класса
C++
1
DateTime::Now::ToString()
C++
1
DateTime::Now.ToString()
0
06.06.2017, 16:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.06.2017, 16:09
Помогаю со студенческими работами здесь

C++/CLI дескрипторы
Ребят, всем привет. Если можно, небольшую консультацию по дескрипторам. Начал изучать Visual C++...

Winsock c++/cli
Доброго времени суток, имеется функция приёма сообщений от клиента: void Server::service_client()...

Встречайте C++/CLI
Корпорация Майкрософт удивила новой версией. А казалось, - король умер. Да здравствует король! ...

C++/CLI (MVS)
Нужны справочные материалы, книги, ну хоть что-нибудь. Через поисковики мало чё нашёл, в основном...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru