Microsoft.NET Первая лекция
COM Доступ к компонентам только через интерфейсы Назначение уникальных идентификаторов компонентам и интерфейсам Регистрация компонент в реестре Отсутствие привязки к конкретному языку
Java Выполнение байт-кода на виртуальной машине Just in time compilation (JIT) Единая объектная модель Богатая стандартная библиотека Обязательная сборка мусора Кроссплатформенность
Microsoft.NET
Объектная модель Все типы так или иначе приводимы к object Существуют типы, передающиеся по ссылке и по значению Для типов, передающихся по значению, при приведении к object и обратно осуществляются операции boxing/unboxing
object class object { public virtual bool Equals(object obj); public static bool Equals(object objA, object objB); public static bool ReferenceEquals(object objA, object objB); public virtual int GetHashCode(); public Type GetType(); public virtual string ToString (); ~object(); // protected void object.Finalize() protected object MemberwiseClone(); }
Сборка мусора
Базовый синтаксис C++/CLI Объявление типов public ref class RefT {}; public value class ValueT {}; public interface class I {}; public enum class E {}; Managed-cсылки, выделение памяти Form^ my_form = gcnew Form();
Взаимодействие.NET и Native C/C++ Platform Invoke [DllImport ("user32.dll")] static extern bool MessageBeep (System.UInt32 type); Выделение managed/unmanaged-блоков #pragma managed #pragma unmanaged Умные указатели pin_ptr, interior_ptr, gcroot
Маршаллинг строк static System::String^ ConvertString(const std::string& str) { return ConvertString(str.c_str()); } static System::String^ ConvertString(const char* str) { return gcnew System::String(System::Runtime::InteropServices::Marshal::PtrToStringAnsi( System::IntPtr((void*)str))); } static std::string ConvertString(System::String^ str) { System::IntPtr hg = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str); std::string result(reinterpret_cast (hg.ToPointer())); System::Runtime::InteropServices::Marshal::FreeHGlobal(hg); return result; }
pin_ptr – указатель, фиксирующий объект static const int size = 1000; int main(array ^args) { array ^ arr = gcnew array (size); pin_ptr ptr = &arr[0]; memset(ptr, 0, size * sizeof(int)); // any native fuction return 0; }
interior_ptr – указатель, отслеживающий перемещения объекта void main() { DoLotsOfAllocs(); Test^ t = gcnew Test(); t->m_i = 99; interior_ptr p = &t->m_i; printf("%p %d\r\n",p,*p); // prints "00AC9B3C 99" DoLotsOfAllocs(); printf("%p %d\r\n",p,*p); // prints "00AA8D18 99" }
gcroot – «корневая» ссылка struct Native { gcroot _form; Native() : _form(gcnew Form()) { } Form^ get_form() { return _form; } }; void native_foo(Native native) { native.get_form()->ShowDialog(); } int main(array ^args) { native_foo(Native()); return 0; }
Взаимодействие.NET и COM
Генерация managed metadata proxy > tlbimp MyModule.dll\1 Исходный метод: void SomeMethod([out, retval] VARIANT_BOOL*);.NET-метод: bool SomeMethod();
Mono, как opensource-реализация.NET Работает на Windows, *nix (Linux, *BSD, MacOS и Solaris) Официально признана Microsoft, как реализация платформы.NET за исключением Windows forms, ASP.NET и ADO.NET В комплект поставки входит GTK#, как альтернатива Windows Forms
Языки программирования для платформ.NET/Mono F# (Microsoft research) Nemerle Boo IronPython A# Delphi Etc…
IDE for.NET Microsoft Visual Studio (C#, C++, VB.NET) SharpDevelop (C#) MonoDevelop (C#, C++, VB.NET…) Eclipse Borland Developer Studio
Преимущества.NET JIT-компиляция Сборка мусора Богатая информация о сущностях языка (Reflection, Call stack в исключениях и т.д.) Богатый framework Переносимость Прозрачная поддержка большого количества языков Очень дешёвая разработка
Недостатки.NET JIT-компиляция (обходится) Сборка мусора (понимание механизма решает почти все проблемы) Неполная переносимость Зависимость от frameworkа