Zentrales Modul in mehrere Projekte einbinden

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    Zentrales Modul in mehrere Projekte einbinden

    Hi,

    ich habe fünf Projekte, nennen wir sie A, B, C, D, E

    Alle Projekte verwenden ein Modul, nennen wir es EncryptDecrypt.vb

    Dieses Modul habe ich aus dem Projekt A mit CopyPaste in die Projekte B - E hineinkopiert. Das ist natürlich blöde, weil ich bei Änderungen immer alle fünf Projekt ändern muss. Ich würde das Modul EncryptDecrypt.vb also gern "zentral" verwalten, d.h. nur einmal für alle fünf Projekte abspeichern.

    Änderungen erfolgen meist im Zusammenhang mit dem Projekt A. Das ist sozusagen das "führende" Projekt. Die anderen vier Projekte B - E nutzen das Modul ... aber es wird dort nichts weiter entwickelt. Ich hätte also gern im Projekt A "änderden Zugriff" auf EncryptDecrypt.vb. Bei einem Neuerstellen der Projekte B - $ soll dann automatisch die neueste Version von EncryptDecrypt.vb angezogen werden.

    Ich habe nun keine Ahnung wie man das am besten lösen könnte oder sollte. Kann man Verweise in die Projekte aufnehmen ? Oder sollte man eher an eine zentrale .dll Datei denken ?

    Ich hoffe, ich habe mein Anliegen verständlich machen können.

    LG
    Peter
    Hallo

    Aus eigener erfahrung weis ich, die für mich beste Methode ist ein eigener lokaler (ja, geht lokal auch) NuGet Feed.
    So kannst du in jedem Projekt über Nuget einfach das Paket einbinden, gibt es Updates wird dir das auch brav angezeigt und du kannst mit einem Klick updaten.
    Ausserdem kannst du bei jedem Projekt sogar entscheiden ob du nur die Stable-Versionen haben willst oder auch Alpha/Beta Versionen.

    Super angenehm.

    Weiter Infos: docs.microsoft.com/en-us/nuget/hosting-packages/local-feeds

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    @Peter329 Wenn ich denselben Code für mehrere Projekte benötige, mach ich mir ne DLL draus und binde sie überall ein.
    Mit Moduln arbeite ich nicht, ich hab da immer Klassen, die werden instanziiert und feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Du kannst eine Datei auch als Verknüpfung hinzufühgen.
    Ich habe ein zentrales Modul mit 'Extension Methods', daß ich wenn ich es brauche als Verknüpfung in das Projekt einfüge.
    Die Möglichkeit Verknüpfungen einzubinden ist leider nicht besonders offensichtlich, um nicht versteckt zu sagen.
    Im Dateiauswahldialog unten rechts befindet sich ein "Dropdown Button", da "Als Verknüpfung einbinden", oder so auswählen.
    Ok .... das mit "Nuget" sieht mir nach einer sehr umfänglichen Lösung aus. Das schau ich mir sicher bei Gelegenheit genauer an.

    Ich würde jetzt aber erst mal die Basistechnik lernen ... das scheint mir die Sache mit der dll zu sein.

    Tja ... da muss ich jetzt ganz dumm fragen: wie erstelle ich denn eine dll ? Und wie binde ich das Dinges dann in mein Projekt ein ?

    Ich vermute mal, ich muss ein neues Projekt für eine "Klassenbibliothek" aufmachen. Das Projekt hab ich "EncryptDecryptLib" genannt.

    Da habe ich jetzt die "Public Class Class1" ... s. Anhang ...

    Wie bekomme ich da jetzt mein EncryptDecrypt Module hinein ?

    Das Modul enthält ein paar Dutzend Funktionen und eine Klasse.

    Ich habe noch nie eine dll geschrieben. Ich hoffe, dass ihr Geduld mit mir habt !

    LG
    Peter
    Bilder
    • s 2017-12-11 14-37-469.jpg

      32,49 kB, 1.285×318, 270 mal angesehen
    • s 2017-12-11 14-40-420.jpg

      19,63 kB, 902×151, 249 mal angesehen
    Hallo

    Die Class1 wird dir ja von vornherein durch VS angelegt. die kanst du einfach löschen.
    Dann erstellst du mit rechtsklick -> hinzufügen -> Klasse eine neue und benenst diese so wie du es willst. z.b. "EncryptDecrypt"
    Dann hast du folgendes stehen:

    VB.NET-Quellcode

    1. Public Class EncryptDecrypt
    2. End Class


    jetzt ersetzt du den ganzen Text durch den in deinem "Modul".

    Wenn du das ganzte jetzt mit STRG + Shift + B kompilierst ist die Sache schon fertig.
    Übrigens: für den Weg mit Nuget benötigst du sowieso auch eine dll und noch mehr. aber ich ging davon aus das die Basics vorhanden sind.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Das hab ich versucht umzusetzen ...

    Allerdings werden jetzt Anweisungen wie Messagebox.Show, Clipboard.GetText etc. etc. abgelehnt.

    Ich nehme an, dass die nicht in eine Klasse gehören, sondern eben in ein Modul ... (s. Anhang)
    Bilder
    • s 2017-12-11 15-18-563.jpg

      108,63 kB, 1.134×524, 264 mal angesehen
    Was für eine Assembly hast du erstellt. Eine .NET Standard, oder Core?

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Peter329 schrieb:

    Allerdings werden jetzt Anweisungen wie Messagebox.Show, Clipboard.GetText etc. etc. abgelehnt.
    Eine DLL hat standardmäßig die Verweise auf System.Windows.Forms und System.Drawing nicht drinne.
    Die musst Du dann Deiner DLL als Verweis hinzufügen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok ... ich habe den Verweis auf System.Windows.Forms hinzugefügt. Damit sind alle fehlenden Referenzen aufgelöst, bis auf die Sache mit den My.Application.CommandLineArgs - das habe ich jetzt herausgenommen. Die Funktion brauche ich nicht unbedingt.

    Das Erstellen der .dll hat nun geklappt. :)

    Wie füge ich diese .dll denn nun meinem Projekt hinzu ?

    Peter329 schrieb:

    Wie füge ich diese .dll denn nun meinem Projekt hinzu ?
    Hinzufügen - vorhandenes Projekt.

    Du kannst der Projektmappe auch gleich eine neue DLL hinzufügen. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo

    Ehrlich? So viele Beiträge und noch nie einen Verweis auf eine Assembly hinzugefügt?
    Schon gegoogelt? Ernsthaft, bitte immer(!!) googeln!! Das spart DIR echt Zeit!!

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Also mein Project heißt TestCalender ... das hat bisher das Modul EncryptDecrypt verwendet.

    Dieses Modul hab ich jetzt gelöscht. Damit werden (erwartungsgemäß) eine ganze Reihe von Variablen und Funktionen nicht mehr gefunden.

    Nun habe ich an TestCalender das vorhandene Projekt EncryptDecryptLib hinzu gefügt. Dieses Projekt enthält die fehlenden Variablen und Funktionen. Aber die Fehlermeldungen verschwinden nicht.

    Was mache ich falsch ?
    Bilder
    • s 2017-12-11 16-26-502.jpg

      209,26 kB, 1.524×1.047, 278 mal angesehen

    Peter329 schrieb:

    Was mache ich falsch ?
    Du versuchst auf diese Objekte in einer Instanz zuzugreifen, die bzw. deren Namespace nicht mehr existiert.
    So was:

    VB.NET-Quellcode

    1. Me.MyValue = 5
    2. '=>
    3. DllInstance.MyValue = 5
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Uff ....

    Nehmen wir die Variable VERIFICATIONPATH

    Diese Variable ist in der EncryptDecryptLib definiert

    VB.NET-Quellcode

    1. Public VERIFICATIONPATH As String


    Diese Variable will ich in frmCalender befüllen. Wie muss ich die jetzt ansprechen ?

    VERIFICATIONPATH = ...
    EncryptDecryptLib.VERIFICATIONPATH = ...
    EncryptDecrypt.VERIFICATIONPATH = ...

    Alle drei Versionen sind falsch.

    Ist VERIFICATIONPATH überhaupt instanziert ?

    Ich bin hier völlig neben der Spur, weil ich die Konzeption nicht verstehe !
    @Peter329 Hast Du eine Klasse oder ein Modukl in der DLL?

    Quellcode

    1. Imports NAME_DES_DLL_HAUPTNAMESPACES
    2. ' und dann
    3. NAME_DES_DLL_HAUPTNAMESPACES PUNKT LEERZEICHEN
    da sollte die IDE Dir was Dir bekanntes vorschlagen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Peter329 schrieb:

    Tja ... da muss ich jetzt ganz dumm fragen: wie erstelle ich denn eine dll ? Und wie binde ich das Dinges dann in mein Projekt ein ?

    schauma Datenverarbeitungs-Vorraussetzungen Punkt #10

    Ich sags ja immer: Jeder lernt das, was da steht - und zwar alles.
    Früher oder später, - auf die harte oder die weiche Tour ;) .
    Der Namespace EncryptDecryptLib enthält die Klasse

    VB.NET-Quellcode

    1. EncryptDecrypt


    Ich habe den Namespace nun importiert.

    VB.NET-Quellcode

    1. Imports EncryptDecryptLib


    Das klappt syntaxmäßig. Der Name des Namespace wird grün unterkringelt, weil er ja noch nicht verwendet wird.

    Nach der Video Anleitung von EDR habe ich dann die EncryptDecryptLib als Verweis in das Projekt Calendar aufgenommen.

    Jetzt wird EncryptDecrypt akzeptiert. Intellisense zeigt mir jetzt verfügbare Variablen an .... aber nur solche, die als Const definiert sind. Ohne Const, erhalte ich einen Fehler:

    In EncryptDecryptLib:

    VB.NET-Quellcode

    1. Public Const HEADERMAX As Integer = 16
    2. Public VERIFICATIONFILE As String


    In Calendar:

    VB.NET-Quellcode

    1. Dim myMax As Integer = EncryptDecrypt.HEADERMAX 'ok
    2. Dim myFile As String = EncryptDecrypt.VERIFICATIONFILE '+++error


    VERIFICATIONFILE ist kein Member von EncryptDecrypt

    Was ist denn jetzt schon wieder falsch ?

    So wie ich das verstehe, dient die "Imports" Anweisung nur dazu, dass ich den Namespace EncryptDecryptLib bei der Qualifizierung weglassen kann.

    Der Verweis macht den Namespace EncryptDecryptLib in Calendar verfügbar.

    Aber wieso werden jetzt Public Variablen in Encrypt Decrypt nicht erkannt ? Und auch die public functions aus EncryptDecrypt sind in Calendar nicht bekannt!

    Ich vermute mal, dass das damit zusammen hängt, weil die Klasse EncryptDecrypt noch nicht initialisiert ist. Wenn ich das mit "new" versuche, erhalte ich einen Fehler. Ist ja auch klar, die dll hat ja keinen Kontruktor ...

    Also ich verstehe einfach nicht, wie das prinzipiell mit dem Einbinden der dll funktionieren soll !

    LG
    Peter


    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „Peter329“ ()