Laden...

[Artikelserie] SharpDevelop Kern in eigenen Anwendungen verwenden

Erstellt von SimonKnight6600 vor 17 Jahren Letzter Beitrag vor 17 Jahren 46.038 Views
S
SimonKnight6600 Themenstarter:in
709 Beiträge seit 2005
vor 17 Jahren
[Artikelserie] SharpDevelop Kern in eigenen Anwendungen verwenden
:::{style="color: darkred;"}Den SharpDevelop Kern in eigenen Anwendungen einsetzen){darkred}
:::{style="color: orangered;"}Artikelserie){orangered}
_**Zielgruppe:**_ Einsteiger und Fortgeschrittene _**Aktueller Artikel:**_ Teil 2 - Erste Beispielanwendung _**Vorraussetzungen:**_ [SharpDevelop 2.1 Beta 2 oder höher](http://sharpdevelop.net/OpenSource/SD/Download/) (für den Einstieg empfohlen, da es dafür eine Projektvorlage gibt) In dieser Artikelserie geht es um das Entwickeln von Anwendungen auf Basis des SharpDevelop Kerns. Dieser bietet ein mächtiges, einfach zu einbauendes AddIn System sowie weitere nützliche Features, die die Erweiterbarkeit und Flexibilität der eigenen Anwendung erheblich steigern. Diese werden in Teil 1 der Serie beschrieben werden. Die einzelnen Teile der Serie bauen auf einander auf. **[ Teil 1](http://www.mycsharp.de/attachments/Using_the_SharpDevelop_core_library_1.pdf)** ...befasst sich mit den Grundlagen und der Einrichtung einer entsprechenden Projektvorlage für SharpDevelop. **[Teil 2](http://www.mycsharp.de/attachments/Using_the_SharpDevelop_core_library_2.zip)** ...befasst sich mit einer ersten Beispielanwendung. Viele elementare Aspekte werden hier erklärt! **Teil 3 (in Planung)** ...wird sich mit einem weiterführenden Thema beschäftigen. Wahrscheinlich wird Lokalisierung und das Speichern von Einstellungen zum Zug kommen. Für Vorschläge bin ich natürlich immer offen 😉. Ich bin für jegliches Feedback dankbar. Der aktuelle Teil 2 stellt eine echte Informationsbombe dar, daher scheut euch nicht zu fragen wenn ihr am Ende nicht mehr durchblickt. Eine guter Test, ob man den Artikel halbwegs verstanden hat ist, die Applikation um einen eigenen Menübefehl zu erweitern. Viel Spaß beim Lesen 🙂
S
SimonKnight6600 Themenstarter:in
709 Beiträge seit 2005
vor 17 Jahren

So, ich habe inzwischen Teil 2 veröffentlicht. Da dieser im Vergleich zu Teil 1 wesentlich umfangreicher ist und wichtiges Basiswissen lehrt, habe ich versucht, mit einer Zusammenfassung und einem Glossar am Ende des Artikels eventuelle Fragen zu beantworten. Sollten trotzdem Fragen aufkommen, stellt diese bitte. Eventuell kann ich den Artikel dann ein wenig verbessern.

Viel Spaß,
Simon

T
223 Beiträge seit 2006
vor 17 Jahren

Hi,

Wäre schön, wenn du in deinem Einleitungspost mit eins, zwei Sätzen erklären würdest, was der SharpDevelop Kern überhaupt ist, und wofür man ihn braucht.

Gruß Thomas

S
SimonKnight6600 Themenstarter:in
709 Beiträge seit 2005
vor 17 Jahren

Hallo Thomas B!

Stand zwar eh schon da, aber ich hab es jetzt noch ein wenig erweitert 😉

vg,
Simon

B
62 Beiträge seit 2006
vor 17 Jahren

Hi Simon,
wenn du die Möglichkeit hast wäre ein Tutorial über den ICSharpCode.TextEditor sehr nett. Ich kämpfe mich nämlich gerade mühsam durch die Möglichkeiten und Funktionen der Komponente und komme nur sehr langsam vorwärts.

Gruß
Burli

F
171 Beiträge seit 2006
vor 17 Jahren

Hallo Simon,

wo ist die Fortsetzung? 😁

Habe mich vor ca. 3Monaten mal durch das englische Material der Autoren von SharpDeveloper gewühlt und nicht durchgeblickt.
War definitiv zu viel für den Anfang.

Dank deiner kleinen Einführung ist mir jetzt einiges klarer geworden und hoffe doch das es bald weitergeht. 👍

Gruß falangkinjau

S
SimonKnight6600 Themenstarter:in
709 Beiträge seit 2005
vor 17 Jahren

Hallo!

Ich werde demnächst anfangen, den Teil 3 zu schreiben. Was würdest du dir denn für dem 3. Teil wünschen?

vg,
Simon

F
171 Beiträge seit 2006
vor 17 Jahren

Hallo Simon,

zum Wunsch mehr nachdem ich meine ersten Eindrücke beim Spielen mit der Beispielapplikation geschildert habe.

Ich habe deine Beispielapplikation um Toolstripitems erweitert, sowohl für die Workbench(Beenden) als auch für das TestAddin(Click me).
Das hat auch wunderbar funktioniert. Wie es geht findet man ja z.B. im Sample ICSharpCode.Core.Demo.

Was mich nun irritiert ist das ich beim TestAddIn die Resourcen nicht referenzieren kann, wenn diese im TestAddinprojekt erstellt werden.

Beispiel:

So geht es, wenn ich die Einträge der Resourcen in der globalen StringResources.resources bzw. Image... also unter Applikation/Startup ablege bzw. eintrage.

aus TestAddIn.addin


<Path name="/Workbench/MainMenu/File">
	<MenuItem id="TestMenuItem" class="TestAddIn.TestItem" label="${res:TestAddIn.Menu.File.ClickMe}" insertbefore="Quit" />
</Path>
	
<Path name="/Workbench/Toolbar">
	<ToolbarItem id="TestMenuItem" tooltip="${res:TestAddIn.Tooltip.File.ClickMe}"  icon="DocumentHS" class="TestAddIn.TestItem" insertafter="Quit" />
</Path>

Erstelle ich die Resourcen aber im TestAddInprojekt, dann werden diese nicht referenziert. Als Label wird dann "${res:TestAddIn.Menu.File.ClickMe}" angezeigt.
Hier muß ich wohl noch was falsch machen bwz. ich habe es noch nicht verstanden wo für was welche Resourcen abgelegt werden.

Nun zu mein Wunsch und Vorschlag für Artikel 3:

Konfiguration eines AddIn. Neuer Menüeintrag erstellen "Option..." Es geht der Konfigurationsdialog auf wie bei SharpDeveloper. Dort gibt es natürlich nur den Eintrag TestAddIn. Was wollen wir konfigurieren: z.B. Messagestring der Messagebox welche bei ClickMe angezeigt wird.

Ich denke das ist sehr heftig, würde aber gut die Interaktion demonstrieren. Darüber würde auch gezeigt werden wie ein AddIn konfiguriert wird.

Vielleicht hast du ja auch eine andere und bessere Idee.

Gruß falangkinjau

D
32 Beiträge seit 2005
vor 17 Jahren

Hallo,
ich finde deine Artikel immer wieder gut und auch diesen. Ich habe nachdem ich Artikel 2 durchgelesen haben, auch ein bisschen rumgespielt mit der beigelegten Testapplikation und habe ein neues AddIn geschrieben. Doch leider musste ich festellen, dass es nicht funktioniert.

Er schmeißt ne Fehlermeldung raus und meint, er könne TestAddinB nicht in ICSharpCode.Core.ICommand umwandeln, dabei habe ich alle nach dem vorhanden AddIn gemacht.

Hier die Datei TestAddIn2.addin

<AddIn name="TestAddIn2" author="Christian">
	<Runtime>
		<Import assembly="TestAddIn2.dll" />
	</Runtime>

	<Path name="/Workbench/MainMenu/File">
		<MenuItem id="TestMenuItemB"
		          class="TestAddInB.TestItemB"
		          label="Click me harder!"
		          insertbefore="TestMenuItem" />
	</Path>
</AddIn>

Hier die Datei TestItem2:

using System;
using ICSharpCode.Core;
using System.Windows.Forms;
using System.Collections.Generic;

namespace TestAddInB
{
	public class TestItemB : AbstractMenuCommand
	{
		public override void Run()
		{
			
		}
	}
}
S
SimonKnight6600 Themenstarter:in
709 Beiträge seit 2005
vor 17 Jahren

Hallo!

@DarkKiller: Hast du im TestAddInB eine andere Version der ICSharpCode.Core Library verwendet, als für das Hauptprogramm? Wenn nicht, poste mal deine Version der Beispielanwendung oder schick sie per E-Mail an simon.schweiger AT tnr.at

@falangkinjau: Du musst die Resourcendateien für dein AddIn registrieren, bevor sie das erste Mal verwendet werden. Am Besten machst du dass über einen Eintrag in den Pfad "/Workspace/Autostart/".

  <Path name="/Workspace/Autostart">
    <Class class="TestAddIn.ResourceRegistrar" />
  </Path>

Alle Klassen die dort eingetragen werden müssen von ICommand abgeleitet sein und werden vor dem Start der Anwendung ausgeführt. In der oben eingetragenen Klasse registrieren wir nun die Resourcen. Der erste Parameter ist eine Art ID und der zweite die Assembly, in der die Resourcen als EmbeddedResource eingebunden sind.


using System;
using System.Collections.Generic;
using ICSharpCode.Core;

namespace TestAddIn
{
    public class ResourceRegistrar : ICommand
    {

        private object owner;
        public event EventHandler OwnerChanged;
        public object Owner
        {
            get
            {
                return owner;
            }
            set
            {
                owner = value;

                if (OwnerChanged != null)
                    OwnerChanged (this, EventArgs.Empty);
            }
        }

        public void Run()
        {
            ResourceService.RegisterStrings("TestAddIn.StringResources", typeof(ResourceRegistrar).Assembly);
        }

   
        #endregion
    }
}

Der Code ist ungetestet, sollte aber hoffentlich funktionieren. Im nächsten Artikel werde ich auf jeden Fall das Speichern von Einstellungen behandeln.

vg,
Simon

S
SimonKnight6600 Themenstarter:in
709 Beiträge seit 2005
vor 17 Jahren

Hallo

Ich hab das Problem von DarkKiller gelöst bekommen. Es wichtig, dass das AddIn keine aktuellere Version der ICSharp.Code Library referenziert, als das Hauptprogramm! Bei DarkKillers TestAddIn wurde die Version 2.1.2199 referenziert und im Hauptprogramm 2.1.2017

vg,
Simon

F
171 Beiträge seit 2006
vor 17 Jahren

Hallo Simon,

nur noch


public event EventHandler OwnerChanged;

hinzufügen und es funktioniert tatellos.

Danke und Gruß falangkinjau

K
20 Beiträge seit 2006
vor 17 Jahren

Ich könnte mir auch gut ein Tutorial über die Einbindung eigener Pads vorstellen. Und mit den globalen Einstellungen finde ich gut.

Gibt es eigentlich schon ein Termin für den 3. Teil?

Krischan100