Frage an dll, vb.net – Wie binde ich eine DLL aus einem "Klassenprojekt" in mein Projekt in vb.net ein?

4

Ich habe ein Standardprojekt "Klassenbibliothek" mit einer Reihe von Klassen, die ich zum Importieren in fast alle meine neuen Projekte verwende.

Bei meiner Arbeit erstelle ich eine neue Lösung mit einem leeren Projekt, das mein Hauptprojekt ist, und füge dann das erwähnte Klassenbibliotheksprojekt zur Lösung hinzu. Auf diese Weise kann ich beide Projekte im Soluction Explorer anzeigen und sogar den Bibliothekscode anzeigen oder aktualisieren Sie es bei Bedarf. Dann schreibe ich den Code in mein Hauptprojekt und kompiliere.

Dies führte dazu, dass ich beim Kompilieren 2 Dateien hatte: file * .exe und stdlib.dll

In einigen Fällen verwende ich die lib für sehr kleine Tools, die ich einfach und übersichtlich weitergeben möchte. Daher möchte ich die aus meinem Klassenbibliotheksprojekt generierte stdlib.dll in meine * .exe-Datei einbetten.

Ich bin mir ziemlich sicher, dass es in meinem Microsoft Visual Basic 2010 Express einen Grund dafür geben muss, aber ich weiß nicht, wie.

Irgendein Vorschlag?

Vielen Dank im Voraus.

stackoverflow.com/questions/27891550/…  es funktioniert genauso mit vb.net bigworld12

Deine Antwort

2   die antwort
9

Alex 'Prozedur zum Einbetten der Baugruppe.

Fügen Sie den Projektressourcen die gewünschte Assembly (stdlib.dll) hinzu.
Gehe zumRessourcen Registerkarte der Projekteigenschaften und wählen SieRessource hinzufügen> Vorhandene Datei hinzufügen ...Wechseln Sie zuAnwendung Registerkarte und klicken Sie auf dieAnwendungsereignisse anzeigen Taste.

Fügen Sie diesen Code dem hinzuApplicationEvents.vb Code, der geöffnet wird.

<code>Private Sub AppStart(ByVal sender As Object, 
  ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup
    AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf ResolveAssemblies
End Sub

Private Function ResolveAssemblies(sender As Object, e As System.ResolveEventArgs) As Reflection.Assembly
    Dim desiredAssembly = New Reflection.AssemblyName(e.Name)

    If desiredAssembly.Name = "the name of your assembly" Then
        Return Reflection.Assembly.Load(My.Resources.STDLIB) 'replace with your assembly's resource name
    Else
        Return Nothing
    End If
End Function 
</code>

Kompilieren Sie nun Ihr Projekt und Sie haben die abhängige Assembly als einzelne Datei in die Ausgabe integriert.

Beachten Sie, dass sich die abhängige Assembly manchmal im Ausgabeordner befindet. Dies liegt daran, dass VS so vorkonfiguriert ist, dass alle abhängigen Assemblys in den Ausgabepfad kopiert werden. Sie können dies überschreiben, indem Sie auf dieVerweise Registerkarte der Projekteigenschaften und legen Sie dann dieLokal kopieren Eigentum der abhängigen VersammlungFalsch. Dadurch wird verhindert, dass die Assembly in das Ausgabeverzeichnis kopiert wird.

@AlexEssilfie Hmm. Ich wünschte, Microsoft hätte eine einfachere Lösung in VS selbst oder etwas Ähnliches implementiert. Sree
@ MauryMarkowitz: Der einzige Grund, an den ich denken kann, ist ...Weil es so funktioniert. Beachten Sie Folgendes: Das .NET-Framework erledigt eine Menge Arbeit beim Laden von Assemblys, wenn Sie sie als DLL-Dateien im EXE-Pfad oder in einem anderen Standardpfad belassen. Wenn Sie sich jedoch für Embedded Resource entscheiden, kann das Framework nicht erkennen, ob es sich bei der Ressource um eine Assembly handelt, die Sie zur Laufzeit laden möchten, oder ob Sie auf andere Weise damit arbeiten möchten. Sie müssen daher angeben, wo sich die gewünschte Assembly befindet, und daher den gesamten Code schreiben. Alex Essilfie
Möglicherweise dumme Frage: Warum macht die Auswahl von Embedded Resource in der Build Option dies nicht für Sie? Anders ausgedrückt: Warum ist Code erforderlich? Maury Markowitz
Ein kleiner Hinweis für diejenigen, die sich fragen: Ersetzen"the name of your assembly" mit dem genauen Namen der Assembly, als würden Sie Code eingeben. Wenn der Name istMicrosoft.WindowsAPICodePack, dann wird der Wert der Zeichenfolge sein"Microsoft.WindowsAPICodePack". Sree
1

Assembly (.dll in Ihrem Fall) in Ihr Projekt, indem Sie "Vorhandene Datei hinzufügen" auswählen und dann die Build-Option in "Eingebettete Ressource" ändern.

Sie fügen dann einHandler für dieAppDomain.CurrentDomain.AssemblyResolve Ereignis, das ausgelöst wird, sobald Sie zum ersten Mal auf die Bibliothek in Ihrem Code zugreifen.

Dieser Handler-Code sieht folgendermaßen aus: (Beachten Sie den vollständig qualifizierten Assembly-Pfad einschließlich der korrekten Namespacs. Ich würde ihn in eine Funktion einschließen, die beim Start Ihrer Anwendung aufgerufen wird.

<code>   AddHandler AppDomain.CurrentDomain.AssemblyResolve,
            Function(sender As Object, args As System.ResolveEventArgs) As System.Reflection.Assembly
                Dim ressourceName = "YourNamespace.YourSubNamespace." + New AssemblyName(args.Name).Name + ".dll"
                Using stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(ressourceName)
                    Dim assemblyData(CInt(stream.Length)) As Byte
                    stream.Read(assemblyData, 0, assemblyData.Length)
                    Return Assembly.Load(assemblyData)
                End Using
            End Function
</code>

Sie können Ihr Tool dann ohne zusätzliche Dateien bereitstellen.

Es sieht "kniffliger" aus als ich dachte, aber trotzdem danke. Ich werde es versuchen. Alex

Verwandte Fragen