Из Delphi в .NET + C #

Я уже много лет являюсь разработчиком Delphi (D7), меня всегда интересовало, что такое .NET + C #. Я имею в виду не технологию / плагин "Delphi для .NET" или "Oxygene", а чистый .NET / C #.

Насколько он отличается от Delphi? И еще несколько вопросов ...

  • Является ли Mono / SharpDevelop (любые другие, о которых мне следует знать?) Такими же возможностями, как несвободная Visual Studio?
  • Что касается развертывания, как это работает? Сборка + фреймворк + исполняемый файл?
  • Framework (последняя версия 3.5?) Работает как JVM для мира Java, верно? Обеспечивает ли он поддержку / использование таких технологий, как многоядерные процессоры или оптимизация для Windows?
  • C # имеет некоторое сходство с Object Pascal, не должно быть слишком сложно адаптировать, верно?

Спасибо.


person Atlas    schedule 26.10.2008    source источник


Ответы (3)


По первому пункту: пробовали ли вы (бесплатную) VIsual Studio Express Edition? Это прекрасно подходит для многих вещей. У вас просто не так много помощников / дизайнеров и нет поддержки плагинов (для расширений IDE).

Что касается второго: исключая некоторые неприятные уловки, вы не можете создать чистый родной исполняемый файл из .NET; он сильно полагается на доступность инфраструктуры на локальном компьютере. Сборка - это просто пакет IL и может содержаться (обычно) либо в dll, либо загружаться в исполняемый файл, который загружает точку входа сборок; но в этом сценарии exe - это просто простой загрузчик плюс обычная сборка.

Собственно, CLR больше похожа на JVM; «каркас» на самом деле эквивалентен BCL. Основная структура MS + CLR, безусловно, имеет некоторые оптимизации для Windows, но другие среды выполнения / платформы (компактный, micro, Silverlight, Mono) будут разные оптимизации.

Повторно многоядерный - у вас есть полная поддержка потоков (для самостоятельного выполнения), но основная автоматизированная многоядерная поддержка (надеюсь) будет в .NET 4.0 с "параллельные расширения" работают.

По последнему пункту: действительно должно быть очень знакомо. На самом деле, если вы хотите провести некоторые сравнения, "отражатель" (бесплатно) может возьмите скомпилированную сборку и покажите вам код на C # или delphi (или некоторых других).

[обновить вопросы]

IL = промежуточный язык; .NET компилируется не под собственные инструкции ЦП, а с чем-то промежуточным, что становится инструкцией ЦП во время выполнения (скомпилировано «Just In Time» (JIT) на основе метода за методом). Это означает, что JIT-компилятор может оптимизировать тот же IL для локальной машины. Вы можете сделать это заранее, используя NGen.

CLR = Common Language Runtime; по сути виртуальная машина

BCL = Библиотека базовых классов; набор классов разделял мои многие приложения

Повторное развертывание: сначала установите .NET framework на клиенте ;-p

После этого - разные варианты. На самом простом уровне вы можете просто скопировать exe / etc на локальный компьютер и запустить. Например, я использую «robocopy» для отправки кода на веб-серверы.

Для полной локальной установки сложного клиентского приложения можно использовать msi (и полная VS IDE поможет вам в этом).

Для простых клиентов вы можете использовать ClickOnce - который упаковывает приложение в подписанный пакет, который обеспечивает возможности самообновления и т. д. и позволяет вам делать заявления о том, какая безопасность вам нужна (полное доверие и т. д.). Express Edition позволяет создавать пакеты ClickOnce. ClickOnce можно использовать даже на заблокированных клиентах, на которых пользователь не может устанавливать приложения, поскольку приложение изолировано и изолировано.

Наконец, вы можете запустить приложение .NET из общего сетевого ресурса, но это может сказаться на безопасности: уровень «Безопасность доступа для кода» не будет предоставлять сетевому ресурсу «полное доверие» (хотя в последнее время в него были внесены некоторые изменения, так что сопоставленные (F: etc) общие ресурсы являются доверенными). Поэтому вам нужно использовать CASPOL на каждом клиенте, чтобы доверять коду. ClickOnce было бы проще ;-p

person Marc Gravell    schedule 26.10.2008
comment
Спасибо за информацию. Что касается развертывания, я не совсем понимаю ... Не могли бы вы привести мне пример, скажем, Развертывание приложения (подключенной базы данных) на клиентском компьютере, что обычно нужно делать? Простите за вопрос, но что такое IL + BCL + CLR? - person Atlas; 26.10.2008

В дополнение к ответу Марка это были незначительные приятные сюрпризы во время моего перехода с D6 на C #:

  • лучше ООП, без глобальных переменных ("var MainForm: TMainForm" и т.п.)
  • все строго типизировано (в общем, у вас может не быть типов указателей)
  • в Windows Forms «текстовый файл .dfm» (здесь YourForm.Designer.cs) на самом деле представляет собой код C #, а не описание ресурса на настраиваемом языке. (Однако это резко изменилось с появлением WPF и XAML.)
  • возможны настраиваемые типы значений («структуры») (например, у вас может быть «сложный» тип, который ведет себя как целое или единственное число, живущее в стеке)
  • перегрузка оператора

И мелкие неприятные сюрпризы:

  • нет ссылок на классы, подобные Delphi («класс xxx», например, «тип TControlClass: класс TControl»)
  • нет индексированных свойств (хотя вы можете подделать это с помощью вложенных классов)

Что ж, это все, о чем я могу думать прямо сейчас, через несколько лет.

person Alan    schedule 26.10.2008
comment
Я бы добавил Интерфейс в список приятных сюрпризов. С интерфейсами Delphis ужасно работать, поскольку они требуют ссылки. В C # они гладкие, как шелк. - person Martin Liesén; 28.10.2008
comment
Интерфейс Delphi может работать без рефсчета. Конечно, поскольку сборщик мусора не используется, время жизни разработчика интерфейса зависит от кода. В любом случае я бы не назвал приятным сюрпризом отсутствие указателей или глобальных переменных / функций - это больше похоже на кошмар. - person ; 25.05.2011
comment
1. Статический член - это более или менее глобальная переменная. Просто разнообразный синтаксис, но может привести к той же проблеме архитектуры ООП. 2. Delphi также имеет строгую типизацию для указателей - злоупотребление указателями - это плохо, мы все согласны, но они в несколько раз быстрее и лучше. 3. Это личное мнение и зависит от вашей привычки - кто редактирует содержимое .dfm вручную? 4 + 5. В современной версии delphi вы можете иметь такие настраиваемые типы значений с перегрузкой оператора. - person Arnaud Bouchez; 26.05.2011

Delphi был написан тем же человеком, который написал C #, поэтому общая структура языка не будет самым сложным переходом. Вы также должны помнить, что C # похож на C, а Delphi - на Pascal. Я пробовал искать Delphi после использования C #, это был очень сложный переход. Во-первых, нет сборки мусора, во-вторых, как @Alan заявил, что глобальные переменные жесткие. У вас есть наследование с C #, но вам не нужно объявлять Form как переменную TForm и т. Д. В-третьих, развертывание было огромной болью. С .Net и GAC вы действительно просто создаете свое решение и приступаете к работе. В-четвертых, гораздо большее беспокойство вызывает продолжение поддержки Delphi. Сейчас это его третья рота. Я бы подумал, что пойти противоположным путем с Delphi на C # будет намного проще.

person Joe Tyman    schedule 25.05.2011
comment
Delphi создает автономные исполняемые файлы, которые использовали развертывание xcopy намного раньше, чем .NET. Большинство программного обеспечения работает без сборщика мусора. Как и в случае с любыми гибридными объектно-ориентированными языками (например, C ++), использование глобальных переменных зависит от вас. Глобальная переменная TForm, созданная мастером форм, просто удобна. Вы можете удалить его, если знаете, как освободить форму, когда она будет уничтожена. По крайней мере, вам не нужно объявлять фиктивные классы только для хранения глобальных данных. - person ; 25.05.2011
comment
Я могу добавить dll после dll в свое программное обеспечение и не беспокоиться об этом с .Net. Хотя для простого exe это может быть бесполезным, но это очень ценный сложный программный продукт, в котором у меня есть много библиотек. Без GC, кодированного вами или самим кодом, возникли бы утечки памяти, со значениями, связанными с формированием, это не проблема. Хотя C ++ - это рабочая лошадка, Java и C # существуют не просто так, глобальная идея - не лучшая идея, и она не нужна в ООП. - person Joe Tyman; 25.05.2011
comment
У вас есть наследование с C #, но вам не нужно объявлять Form как переменную TForm и т. д. Отсутствие соглашения о различиях в Delphi доставляет мне головные боли при чтении Visual Basic или C #, которые я получил при поиске .. . - person Fabricio Araujo; 25.05.2011
comment
С Delphi гораздо меньше необходимости добавлять DLL после DLL в программное обеспечение. И даже если вы это сделаете, просто скопируйте в папку, если вы не предпочитаете быть профессионалом и использовать установщик. Java и C # существуют для того, чтобы иметь возможность нанять дешевых программистов, которые не могут избежать утечек памяти и могут выстрелить в ногу с помощью указателей. Глобалы необходимы и в ООП - почему разработчики реализуют поддельные классы для хранения глобальных данных и реализации глобальных функций? - person ; 26.05.2011
comment
Да, добавленная стоимость установщика имеет смысл для каждого малого бизнеса, которому требуется специальное программное обеспечение. Delphi - неплохой язык, как вы думаете, C #. Это просто продукт 90-х и детище Паскаля. Похоже, что в 2011 году эти вещи сильно пострадали. - person Joe Tyman; 26.05.2011
comment
InnoSetup - это установщик с нулевой стоимостью, и я повторяю, это всего лишь профессиональный подход, вы можете развернуть его без, если хотите, и вам не нужно инициализировать файлы конфигурации, реестр и тому подобное. Я не думаю, что C # плохой язык, но и Delphi не так хорош, как многие здесь думают, и не пишут об этом истинных заявлений. C - продукт 60-х и C ++ 80-х. Кажется, им сегодня больно? Почему Паскаль должен болеть в 2011 году? Просто потому, что он не использует синтаксис типа Си? Но его синтаксис такой же мощный, как у C ++ (но множественное наследование), так в чем проблема? Просто вы к этому не привыкли? - person ; 27.05.2011
comment
Паскаль был создан как язык обучения, в то время как C был разработан для Unix и Unix для C. Паскаль развился в значительной степени из-за статьи под названием Почему Паскаль не мой любимый язык. Если вы хотите манипулировать битами, конечно, вы собираетесь использовать C. Если вы собираетесь создать серьезную программу (например, ОС), вы собираетесь использовать C ++. Delphi отлично подходила для программного обеспечения RAD. Он намного лучше, чем VB 6.0, и все еще может идти рука об руку с VB.NET. Лично мне не нравится, когда в моем коде есть английские слова. У Delphi и VB есть тонны. Begin, End, then и т. Д. Синтаксис C-подобный намного лучше для этого. - person Joe Tyman; 27.05.2011