Von Bildern, Grafiken und anderen Ressourcen

Veröffentlicht: 23. Mai 2002 | Aktualisiert: 06. Dez 2004

ask_the_experts1

Bild02

Wie erzeuge und speichere ich Bilder mit .NET?

Der Inhalt eines System.Drawing.Bitmap-Objektes kann im Speicher erzeugt oder aus einer Datei geladen werden, z.B.

Imports System.Drawing
Dim bmp As New Bitmap("mypic.bmp")
bmp.Save("mypic2.jpg", Imaging.ImageFormat.Jpeg)

Genauso kann er auch gespeichert werden. Alles in verschiedenen Formaten (BMP, JPG, TIFF usw.).

Bild02

Kann ich Grafiken serverseitig erzeugen?

Beispiele zu diesem Thema finden sich unter:
http://www.fawcette.com/vsm/2001_12/online/online_eprods/jgoodyear/
http://msdn.microsoft.com/msdnmag/issues/02/02/ASPDraw/print.asp

Bild02

Wie kann ich ein GUID erzeugen?

Unter Visual Basic 6 waren dafür rund 15 Zeilen Code notwendig. In Visual Basic .NET reicht eine einzige aus:

Guid.NewGuid

Bild02

Sind die Ressourcen veraltet?
Ich habe Visual Studio .NET Professional unter Windows 2000 Workstation installiert. Wenn ich ein Beispiel testen will, bekomme ich beim Compilieren den Hinweis Resourcen sind veraltet. Was bedeutet das?

Falls das Sample-Code mit Resourcen aus der Beta-Version ist, gibt es unter http://www.gotdotnet.com/team/upgrade/betaupgrade.aspx weitere Informationen dazu.

Bild02

Der Installer startet immer. Was kann ich tun?
Wenn ich eine VB6-Andwendung auf einem anderen Windows-2000-Rechner installiere, erscheint beim Starten der Anwendung immer ein Dialog-Fenster des Windows-Installer, der dann von der Office-CD etwas installieren will. Doch damit nicht genug: Seit ich zusätzlich mit VB .NET (deutsches Framework, englisches Studio) arbeite, kommt der Dialog sogar jedes mal, wenn ich in der VB6-Entwicklungsumgebung ein Formular öffne.

Am besten erst den neuen Installer InstMSI.exe (2.0) von Microsoft herunterladen unter http://download.microsoft.com/download/WindowsInstaller/Install/2.0/NT45/EN-US/InstMsiW.exe dann weiter informieren über Q260404.

Bild02

Eine DLL soll sich nicht entladen. Wie mache ich das?
Gibt es eine Möglichkeit, eine DLL zu schreiben, die sich nicht mehr entlädt?

Das System entlädt eine DLL, wenn FreeLibrary aufgerufen wird und der interne Referenzzähler auf 0 fällt. Jedes LoadLibrary inkrementiert den Zähler. Ein Weg wäre somit, die DLL selbst LoadLibrary aufrufen zu lassen. Wird kein korrespondierendes FreeLibrary aufgerufen, bleibt die DLL geladen.

Soll die DLL später über FreeLibrary dann doch noch entladen werden, muss die DLL unbedingt FreeLibraryAndExitThread verwenden. Sonst könnte es einen UAE geben, weil FreeLibrary die DLL zwar aus dem Speicher wirft, selbst aber auf die entsprechende Adresse in der DLL zurückspringen will.

Bild02

Wie binde ich Grafiken in Assemblies ein?
Wie packe ich ein Image (ICO oder JPG und so weiter) in eine Ressourcendatei (resx)?

Zuerst wird die Grafik in das Projekt aufgenommen und unter den Eigenschaften als Ressource spezifiziert. Beim nächsten Compile-Vorgang bindet die IDE die Grafik in das Assembly als Resource ein. Der Name setzt sich dann aus dem Namen des Assemblies und dem Namen der Grafik zusammen. Heißt das Assembly etwa Projekt und die Grafik im Root des Projektes bild.jpg dann ist die Resource unter Projekt.bild.jpg zu finden.

Folgender VB-.NET-Code lädt die Ressource in ein Image-Objekt. Der Weg in die PictureBox ist dann nicht mehr weit.

Dim asm As System.Reflection.Assembly
asm = System.Reflection.Assembly.GetExecutingAssembly()
PictureBox1.Image = _
Image.FromStream(asm.GetManifestResourceStream(asm.GetName().Name +".bild.jpg"))
new Icon(typeof(ClassX), "Resources.ClosedFolder.ico")
new Bitmap(typeof(ClassX) ,"Resources.Mask.bmp")

Dabei muss die Klasse ClassX im Default-Namespace definiert sein. In diesem Beispiel liegen die Bilddateien im Unterverzeichnis Resources.

Noch einfacher geht es mit dem Resource-Editor von Lutz Roeder. Das Tool öffnet Resource-Dateien öffnen und per Mausklick fügt man ein Image hinzu. http://www.aisto.com/roeder/dotnet/.