540 likes | 770 Views
.NET als Komponenteninfrastruktur. Vortragender :. Boris Tsarev. Seminar „Komponentenbasierte Software-Entwicklung“ – WS 04/05 Prof. Löhr, Karl Pauls. Inhalt. Was ist eine .NET Komponente? Architektur von .NET Framework .NET Assemblies Komponenten in .NET
E N D
.NET als Komponenteninfrastruktur Vortragender: Boris Tsarev Seminar „Komponentenbasierte Software-Entwicklung“ – WS 04/05 Prof. Löhr, Karl Pauls
Inhalt • Was ist eine .NET Komponente? • Architektur von .NET Framework • .NET Assemblies • Komponenten in .NET • Enterprise Component Services in .NET .NET als Komponenteninfrastruktur, B. Tsarev
Was ist eine Softwarekomponente? • Eine Softwarekomponente* ist • eine wiederverwendbare binäre Einheit • zur Komposition von Anwendungen • definiert Schnittstellen und stellt Dienste bereit • kann allein installiert werden • kann von Drittanbieter erstellt oder benutzt werden * [an Szyperski angelehnt] .NET als Komponenteninfrastruktur, B. Tsarev
Aspekte der Granularität von Softwarekomponenten • Eine Komponente bildet eine Einheit bezüglich: • Abstraktion • Kompilierung • Auslieferung • Installation • Konfiguration • Lokalisierung • Laden .NET als Komponenteninfrastruktur, B. Tsarev
Inkonsistente Nutzung des Begriffs „Komponente“ in .NET • „To be a component, a class must implement the System.ComponentModel.IComponent interface and provide a basic constructor that requires no parameters or a single parameter of type IContainer.“ [MSDN Library] • Komponente wird an einigen Stellen der Dokumentation als Synonym von .NET Assembly verwendet [.NET Framework SDK] • „In this book, a component is a .NET class.“ [„.NET Components“ von Juwal Löwy] • Sprachunabhängigkeit auf Klassenbasis bereits zur Entwicklungszeit! • Component Services auf Basis der Klassen! .NET als Komponenteninfrastruktur, B. Tsarev
Was ist eine .NET Komponente? • Eine Definition, die der allgemeinen Definition zur Softwarekomponente gerecht ist: „Jede .NET Assembly ist eine Komponente, sofern sie öffentliche Klassen bereitstellt.“ [www.it-visions.de – Dr. Schwichtenberg] Assembly Öffentliche Klasse1 Öffentliche Klasse2 Interne Klasse3 Interne Klasse4 .NET als Komponenteninfrastruktur, B. Tsarev
Architektur von .NET Framework .NET Programmiersprachen Ein gemeinsames Typsystem für alle .NET Sprachen Umfangreiche Klassen-Bibliothek Laufzeitumgebung .NET als Komponenteninfrastruktur, B. Tsarev
Common Language Infrastructure - CLI .NET Assembly C# Compiler C# Intermediate Language+ Metadata VB.NET Compiler VB.NET Loader C++ Compiler C++ ... IL JIT-Compiler Compiler C++ J# Execution Virtual Execution System CLI ist ECMA und ISO-Standard! .NET als Komponenteninfrastruktur, B. Tsarev
Common Language Runtime (CLR) • CLR ist die Microsoft Implementierung von CLI • Laufzeitumgebung zur Ausführung von Managed Code • Laden von .NET Assemblies/Modulen • Auflösung von Verweisen auf Assemblies • Sicherheits- und Versionsüberprüfungen • Speicherverwaltung • Übersetzung in native code und Ausführung • Fehlerbehandlung .NET als Komponenteninfrastruktur, B. Tsarev
insert stubs Class1 Class2 call Method1 (native) Stub Method1 (IL) Stub Method2 (IL) call Class2 compile JIT-Compiler Method1 (native) Stub Method2 (IL) JIT-Übersetzung Class Loader Class Loader load .NET als Komponenteninfrastruktur, B. Tsarev
Interoperabilität mit .NET • Interoperabilität zwischen verschiedenen .NET Programmiersprachen • Gemeinsames Typsystem (Common Type System) • Gemeinsame „Zwischensprache“ (Common Intermediate Language) • Richtlinien bei der Übersetzung in IL (Common Language Specification) • Mächtige Klassenbibliothek, die allen Programmier-sprachen zur Verfügung steht .NET als Komponenteninfrastruktur, B. Tsarev
Interoperabilität mit .NET - Beispiel .NET als Komponenteninfrastruktur, B. Tsarev
Plattformunabhängigkeit mit .NET • Laufzeitumgebung für die jeweilige Plattform (Windows - CLR, FreeBSD und Mac OS X – Rotor, Linux - Mono) • .NET Compact Framework für mobile Geräte • Standardisierter „Satz von Instruktionen“ für die „Zwischensprache“ .NET als Komponenteninfrastruktur, B. Tsarev
Assemblies – Übersicht • Was ist eine Assembly? • Aufbau einer Assembly • Erstellung von Assemblies • Installation von Assemblies .NET als Komponenteninfrastruktur, B. Tsarev
Was sind Assemblies? • Assemblies sind die Bestandteile einer .NET Anwendung • Eine Assembly ist die kleinste Einheit bezüglich • Installation • Versionierung • Sicherheitsaspekte • Ausführung bzw. Einbindung • Assemblies sind logische Gebilden • Können aus mehreren Dateien bestehen • Die Beziehung der Dateien in einer Assembly ist auf Dateiebene nicht ersichtlich • selbst-beschreibend – keine Zusatzinformation nötig, um die Assembly zu starten oder nutzen .NET als Komponenteninfrastruktur, B. Tsarev
Arten von Assemblies (1) • Statische Assembly • liegt physisch als Datei(en) vor • Dynamische Assembly • wird dynamisch mittels Reflektion erstellt • Klasse System.Reflection.Assembly • „Ausführbare“ Assembly (.EXE) – Out-process Assembly • kann direkt gestartet werden • hat einen Einstiegspunkt – statische Main-Methode • Klassen-Bibliothek (.DLL) – In-process Assembly • kann nur in der Umgebung einer „ausführbaren“ Assembly genutzt werden .NET als Komponenteninfrastruktur, B. Tsarev
Arten von Assemblies (2) • Einzeldatei Assembly • besteht aus genau einer Datei • Mehrdatei Assembly • ist auf mehreren Dateien verteilt • Private Assembly • liegt im Verzeichnis oder einem Unterverzeichnis der .NET Anwendung, von der sie genutzt wird • kann von anderen Assemblies außerhalb des Verzeichnisses nicht genutzt werden • Shared Assembly – öffentliche Assemby • wird auf dem Zielsystem an einem allen bekannten Ort installiert – Global Assembly Cache (GAC) • kann von allen genutzt werden .NET als Komponenteninfrastruktur, B. Tsarev
Aufbau einer Assembly • Assemblies bestehen aus • Ein oder mehreren .NET-Modulen • Ressourcen-Dateien (Bilder, Textdateien, usw.) • Assembly-Manifest (verpflichtend) • Diese Bestandteile können beliebig auf Dateien verteilt werden bzw. mehrere Bestandteile in einer Datei integriert werden • Die Dateien einer Assembly müssen auf dem Zielsystem im gleichen Ordner liegen .NET als Komponenteninfrastruktur, B. Tsarev
.NET Module – „managed module“ • Ein .NET Modul ist die kleinste kompilierbare Einheit • Ein .NET Modul enthält • Definition von Typen und deren Implementierung übersetzt in IL • Metadata – Beschreibung der enthaltenen Typen und ihre sichtbare Elemente, sowie globale Definitionen (Aufzählungen, Delegate) .NET Module IL-Code Metadata .NET als Komponenteninfrastruktur, B. Tsarev
.DLL oder .EXE Manifest .netmodule .netmodule IL-Code IL-Code IL-Code Metadata Metadata Metadata .netmodule Ressourcen IL-Code Metadata Resources Verteilung von Assemblies auf Dateien Einzeldatei-Assembly Mehrdatei-Assembly Mehrdatei-Assembly .DLL oder .EXE .DLL oder .EXE Manifest Manifest IL-Code Metadata Resources Resources .NET als Komponenteninfrastruktur, B. Tsarev
Warum Mehrdatei-Assemblies? • Rücksicht auf kleine mobile Geräten und Internet Anwendungen • CLR lädt einen .NET Modul oder Ressourcen-Datei, nur wenn sie gebraucht wird • Wenn diese in der Assembly-Datei eingebettet sind, werden sie mitgeladen • Bei einer direkt vom Internet gestarteten .NET Anwendung schließt „laden“ auch „herunterladen“ ein! • ..., aber aufwendigere Administration .NET als Komponenteninfrastruktur, B. Tsarev
Assembly-Manifest • Assembly-Identität • Assembly-Name • Version • Culture-Information • Öffentlicher Schlüssel des Erstellers • Liste aller Dateien, aus der die Assembly besteht • Typ-Information – wo sich von außen referenzierbaren Typen befinden • Liste aller statisch referenzierten Assemblies • Weitere Assembly-Attributen wie z.B. Product, Company usw. .NET als Komponenteninfrastruktur, B. Tsarev
Erstellung von AssembliesBeispiel „Banking“ – Klassendiagramm 1 * BankServer Account createAccount (AccountNum:string) readonly AccountNum : string deleteAccount (AccountNum:string) AccountBalance : double checkAccountBalance (AccountNum: string) : double takeMoney (Amount : double) putMoney (Amount : double) payoutAccount (AccountNum:string, Amount:double) payinAccount (AccountNum:string, Amount:double) Demo Quellcode BankClient static Main() .NET als Komponenteninfrastruktur, B. Tsarev
Erstellung von Einzeldatei-Assemblies • Visual Studio .NET erzeugt beim Kompilieren eines Projekts standardmäßig Einzeldatei-Assemblies • Console-Tools • C# Compiler – csc.exe • VB.NET Compiler – vbc.exe • Assembly Linker – AL.exe • Erstellung einer Klassen-Bibliothek (.DLL) > csc /target:library Bank.cs -> Bank.dll • Erstellung einer „ausführbarer“ Assembly (.EXE) > csc /target:exe /r:Bank.dll BankClient.cs -> BankClient.exe .NET als Komponenteninfrastruktur, B. Tsarev
Erstellung von Mehrdatei-Assemblies • Erstellung einer Mehrdatei-Assembly • Quellcode als .NET Module kompilieren > csc /target:module Account.cs -> Account.netmodule • An einem wichtigen .NET Modul das Assembly-Manifest anhängen > csc /target:library /addmodule:Account.netmodule Bank.cs-> Bank.dll • Alternativ das Assembly-Manifest getrennt erstellen > csc /target:module /addmodule:Account.netmodule Bank.cs-> Bank.netmodule > al /out:Bank.dll /t:library Account.netmodule Bank.netmodule -> Bank.dll .NET als Komponenteninfrastruktur, B. Tsarev
Ressourcen in Assemblies • Während der Kompilierung > csc /resource:Menu.txt /r:Bank.dll BankClient.cs -> Die Datei Menu.txt wird in BankClient.exe eingebettet > csc /linkresource:Menu.txt /r:Bank.dll BankClient.cs -> Die Datei Menu.txt wird nur verlinkt • Nutzung von Ressourcen im Code Assembly a = Assembly.GetExecutingAssembly(); Stream strm = a.GetManifestResourceStream (“Menu.txt”); StreamReader sr = new StreamReader(strm); string s = sr.ReadToEnd(); sr.Close(); .NET als Komponenteninfrastruktur, B. Tsarev
Assemblies-Inhalt anzeigen lassen • IL Disassembler - ILDASM.exe • Zeigt das Assembly-Manifest, den Aufbau, die enthaltenen Typen und deren Implementierung in IL an • .NET Component Inspector • Startet die Assembly und erkundet sie mittels Reflection .NET als Komponenteninfrastruktur, B. Tsarev
Installation von privaten Assemblies • Private Assemblies werden von einer Anwendung benutzt • Eindeutige Bindung über Assembly-Name • Installation erfolgt durch Kopieren • Keine Einträge in der Registry nötig! • Installationsort von privaten Assemblies • Selbes Verzeichnis wie Anwendung • Unterverzeichnis mit Namen der Assembly • Unterverzeichnis angegeben als Suchpfad in der Konfigurationsdatei der Anwendung Anwendung.exe.config .NET als Komponenteninfrastruktur, B. Tsarev
Installation von öffentlichen Assemblies • Öffentliche Assemblies können von allen .NET Anwendungen genutzt werden • Eindeutige Bindung über Strong-Name • Sie werden in Global Assembly Cache (GAC) installiert • Erfordert Toolunterstützung • Durch Installer auf dem Zielsystem • Gacutil.exe für Entwickler • In GAC können ohne Probleme unterschiedliche Versionen einer Assembly installiert werden - No more DLL-Hell! • Side-by-Side Execution – CLR kann parallel mehrere Versionen einer Assembly laden .NET als Komponenteninfrastruktur, B. Tsarev
Global Assembly Cache • Zentraler Speicherort aller öffentlichen Assemblies • Vorübersetzte Assemblies für die aktuelle Plattform werden in NativeImages_.. abgelegt • CLR prüft zuerst in NativeImages • Vorübersetzung mit Ngen.exe (Native Image Generator) .NET als Komponenteninfrastruktur, B. Tsarev
Strong Names öffentlicher Assemblies • Öffentliche Assemblies werden durch ihren Strong Names eindeutig identifiziert und referenziert • Bestandteile von einen Strong Name • Name der Assembly • Öffentlicher Schlüssel des Herstellers • Culture (Sprache-Land) z.B. en-US, de-AT • Version: <Major>.<Minor>.<Build>.<Revision> • Beispiel: .NET als Komponenteninfrastruktur, B. Tsarev
Digitale Signierung von Assemblies • Öffentliche Assemblies werden digital signiert • CLR überprüft die Echtheit der Assemblies .NET als Komponenteninfrastruktur, B. Tsarev
Erstellung von öffentlichen Assemblies • Generierung von einem Schlüsselpaar > sn -k MyCompany.keys • Auf die Schlüsseldatei bei der Kompilierung hinweisen • [assembly:AssemblyKeyFile("MyCompany.keys")] • oder al.exe /keyfile:MyCompany.keys > csc /t:library Bank.cs -> Bank.dll ist signiert und kann in GAC installiert werden • Installation in GAC mit gacutil.exe > gacutil /i Bank.dll .NET als Komponenteninfrastruktur, B. Tsarev
Versionskontrolle (1) • Private Assemblies im Programmverzeichnis der .NET Anwendung, die sie nutzt • Für jede .NET Anwendung kann man die genau passende Version einer privaten Assembly haben • Bei öffentlichen Assemblies ist die Version ein Teil der Identität der Assembly • CLR sucht standardmäßig die genaue Version .NET als Komponenteninfrastruktur, B. Tsarev
Versionskontrolle (2) • In GAC können mehrere Versionen einer Assembly installiert werden • Side-by-Side Execution • Mehrere Versionen einer Assembly können gleichzeitig laufen, ohne sich gegenseitig zu stören • Abwärtskompatibilität nicht unbedingt nötig • Vermeidung von „DLL-Hell“ • „Unmanaged“ DLLs können nur in einer Version im System vorliegen • Bei Update einer DLL, können u.U. Applikation, die die alte Version genutzt hatten, nicht mehr lauffähig sein .NET als Komponenteninfrastruktur, B. Tsarev
Versionskontrolle - Konfiguration • In der Konfigurations-Datei Anwendung.exe.config können Verweise auf Assemblies zu neuen Versionen umgeleitet werden • Die Datei kann vom Anbieter der .NET Anwendung mitgeliefert werden • BankClient.exe.config <?xml version="1.0"?> <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Bank" publicKeyToken="dc759fdd93618f15" /> <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="2.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration> .NET als Komponenteninfrastruktur, B. Tsarev
Konfiguration von CLR und Assemblies • Die Konfiguration von CLR basiert auf XML-Konfigurationsdateien • Pfad [Windows]\Microsoft.NET\Framework\ Versionsnummer\CONFIG • Machine.config • Security.config • und weitere • Im Verzeichnis der jeweiligen .NET Anwendung • Anwendung.exe.config • Web.config für ASP.NET Anwendungen • Visuelles Konfigurationstool • Control Panel -> Administrative Tools -> -> .NET Configuration 1.1 .NET als Komponenteninfrastruktur, B. Tsarev
? .NET Framework Class Library Visual Studio .NET CLR .NET Configuration .NET als Komponenteninfrastruktur • Eine Komponenteninfrastruktur besteht aus • APIs, • Entwicklungsumgebung, • Laufzeitumgebung • und Administrationtools • zu Entwicklung, Erstellung, Installation, Administration und Ausführung von Komponenten .NET als Komponenteninfrastruktur, B. Tsarev
Komponentenmodell von .NET Framework • Namespace System.ComponentModel • Basis-Schnittstellen: IComponent, IContainer • Basis-Klassen: Component, Container • Eine Komponente ist eine Klasse, die die Schnittstelle System.ComponentModel.IComponent implementiert oder eine Implementierung davon erbt • .NET Framework bietet automatisch visuelle design-time Unterstützung von allen Typen, die IComponent implementieren • Drag-and-drop auf ein Formular • Einstellung können direkt in Properties-Window angegeben werden • Der entsprechende Quellcode wird generiert .NET als Komponenteninfrastruktur, B. Tsarev
Design-Time Attribute • Durch Attribute im Quellcode kann das Verhalten des Designers beeinflusst werden • Beispiel Category- und Description-Attribute [Category("Appearance")] public Color BorderColor; [Description("The Click event of the button")] public event EventHandler Click; • Andere Attribute • Browsable • DefaultProperty • DefaultValue • usw. .NET als Komponenteninfrastruktur, B. Tsarev
Class vs. Component vs. Control • Empfehlungen bei der Entwicklung von Komponenten [MSDN/Library] .NET als Komponenteninfrastruktur, B. Tsarev
Komponenten in .NET • Komponenten, die IComponent implementieren • Controls • Komponenten mit GUI auf einer Windows Form • ASP.NET Server Controls • Serverseitige Komponenten mit UI auf einer Web Form – durch HTML auf der Clientseite repräsentiert • Serviced Components • COM+ Komponenten .NET als Komponenteninfrastruktur, B. Tsarev
Beispiel: InfoUserControl und MyTimer • MyTimer • eigene Implementierung eines Timers als Komponente • erbt von Component • bietet keine visuelle Oberfläche • InfoUserControl • erbt von System.Windows.Forms.UserControl • Basisklasse für eigene Controls • hat visuelle Oberfläche • kann als Container für andere Controls dienen • Focusmanagement, Positionsmanagement, Keyboard handling Demo! .NET als Komponenteninfrastruktur, B. Tsarev
ASP.NET Server Controls • ASP.NET Web Form • Container für ASP.NET Server Controls • wird zu einer Klasse kompiliert und auf der Server ausgeführt • das Ergebnis ist die dynamische Erstellung einer HTML-Seite, die an den Client verschickt wird • ASP.NET Server Controls • können auf Web Forms positioniert werden • werden durch HTML und Javascript browserspezifisch auf der Clientseite repräsentiert • wiederverwendbar • ASP.NET Control Gallery - http://www.asp.net/controlgallery/ Demo! .NET als Komponenteninfrastruktur, B. Tsarev
Serviced Components • „Serviced Components“ sind Komponenten, die „.NET Enterprise Services“ nutzen • „.NET Enterprise Services“ werden durch COM+ realisiert • COM+ ist das Ergebnis von Integration von COM und MTS (Microsoft Transaction Server) • COM+ ist standard Bestandteil von Windows 2000 und höher • Die .NET Assembly, die die „serviced“ Komponente enthält, wird als Teil einer COM+ Anwendung registriert .NET als Komponenteninfrastruktur, B. Tsarev
.NET Enterprise Services • Instance management • Objektpooling • JITA (Just in-time Activation) • automatisch Fernaufrufe • Transaktionen • Queued components • Web Services • ... und weitere .NET als Komponenteninfrastruktur, B. Tsarev
Programmierung von „serviced“ Komponenten • „Serviced“ Komponenten erben von System.EnterpriseServices.ServicedComponent • keine statische Methoden und Variablen • keine parametriesierte Konstruktoren • Konfigurierung der Dienste • Deployment-spezifische Dienste durch COM+ Explorer • Nicht deployment-spezifische durch Attribute im Quellcode (einige davon durch COM+ Explorer veränderbar) .NET als Komponenteninfrastruktur, B. Tsarev
Programmierung von „serviced“ Komponenten • Am Beispiel des Bank-Servers using System.EnterpriseServices; [assembly: ApplicationName("Bank")] [assembly: ApplicationActivation(ActivationOption.Server)] ... [ObjectPooling(MinPoolSize = 1, MaxPoolSize = 1, CreationTimeout = 60000)] [JustInTimeActivation(true)] public class BankServer : ServicedComponent { protected override bool CanBePooled(){ return true; } ... [AutoComplete(true)] public void createAccount(string strAccountNum) { ... } ... } .NET als Komponenteninfrastruktur, B. Tsarev
Administration von „serviced“ Komponenten • Erstellung • csc /t:library Bank.cs • gacutil /i Bank.dll • csc /t:exe /r:Bank.dll BankClient.cs • Registrierung • regsvsc Bank.dll • Konfiguration durch COM+ Explorer [Control Panel]/[Administrative Tools]/[Component Services] Demo! .NET als Komponenteninfrastruktur, B. Tsarev
Zusammenfassung • .NET als Komponenteninfrastruktur • Programmierspracheninteroperabilität • Plattformunabhängigkeit • Aufteilung größerer Anwendung in Assemblies • Versionskontrolle, Side-by-Side Execution • Flexible Konfigurationsmöglichkeiten von CLR • Umfangreiche „Framework Class Library“ • Design-time Unterstützung von Komponenten durch .NET Framework – IComponent • Komponenten mit UI (Controls) • Controls auf Windows Forms • Server Controls auf Web Forms (ASP.NET) • „Serviced“ Komponenten und .NET Enterprise Services .NET als Komponenteninfrastruktur, B. Tsarev