220 likes | 384 Views
Microsoft .NET. Первая лекция. COM. Доступ к компонентам только через интерфейсы Назначение уникальных идентификаторов компонентам и интерфейсам Регистрация компонент в реестре Отсутствие привязки к конкретному языку. Java. Выполнение байт-кода на виртуальной машине
E N D
Microsoft .NET Первая лекция
COM • Доступ к компонентам только через интерфейсы • Назначение уникальных идентификаторов компонентам и интерфейсам • Регистрация компонент в реестре • Отсутствие привязки к конкретному языку
Java • Выполнение байт-кода на виртуальной машине • Just in time compilation (JIT) • Единая объектная модель • Богатая стандартная библиотека • Обязательная сборка мусора • Кроссплатформенность
Объектная модель • Все типы так или иначе приводимы к 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 = gcnewForm();
Взаимодействие .NET и Native C/C++ • Platform Invoke [DllImport ("user32.dll")] static extern boolMessageBeep (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<const char*>(hg.ToPointer())); System::Runtime::InteropServices::Marshal::FreeHGlobal(hg); return result; }
pin_ptr – указатель, фиксирующий объект static const intsize = 1000; intmain(array<System::String ^> ^args) { array<int>^arr = gcnew array<int>(size); pin_ptr<int>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<int> 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 – «корневая» ссылка structNative { gcroot<Form^> _form; Native() : _form(gcnewForm()) { } Form^ get_form() { return _form; } }; void native_foo(Native native) { native.get_form()->ShowDialog(); } intmain(array<System::String ^> ^args) { native_foo(Native()); return 0; }
Взаимодействие .NET и COM • Генерация managed metadata proxy > tlbimp MyModule.dll\1 • Исходный метод: voidSomeMethod([out, retval] VARIANT_BOOL*); • .NET-метод: boolSomeMethod();
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’а