Pytanie w sprawie vb.net, dll – Jak osadzić dll z „projektu klasowego” w moim projekcie w vb.net

4

Mam standardowy projekt „biblioteki klas” z zestawem klas, których używam do importowania w prawie wszystkich moich nowych projektach.

Sposób, w jaki pracuję, to stworzenie nowego rozwiązania z pustym projektem, który jest moim głównym projektem, a następnie dodam do rozwiązania wspomniany projekt biblioteki klas, w ten sposób mogę zobaczyć oba projekty w Soluction Explorer, a nawet zobaczyć kod biblioteki lub zaktualizuj go w razie potrzeby. Następnie piszę kod w moim głównym projekcie i kompiluję.

To doprowadziło mnie do posiadania 2 plików podczas kompilacji: plik * .exe i stdlib.dll

W niektórych przypadkach używam lib do bardzo małych narzędzi, które chcę redystrybuować w prosty i czysty sposób, więc chciałbym osadzić wygenerowany stdlib.dll z mojego projektu biblioteki klas w moim pliku * .exe.

Jestem pewien, że musi być jakiś powód, aby zrobić to w moim Microsoft Visual Basic 2010 Express, ale nie wiem jak.

Jakieś sugestie?

Wielkie dzięki w zaawansowanym.

stackoverflow.com/questions/27891550/…  działa tak samo z vb.net bigworld12

Twoja odpowiedź

2   odpowiedź
1

Assembly (.dll w twoim przypadku) do swojego projektu, wybierając „Dodaj istniejący plik”, a następnie zmień opcję budowania na „Wbudowane źródło”.

Następnie dodajHandler dlaAppDomain.CurrentDomain.AssemblyResolve zdarzenie, które zostanie zwolnione, gdy tylko uzyskasz dostęp do biblioteki wewnątrz kodu.

Ten kod obsługi wygląda następująco: (Zwróć uwagę na w pełni kwalifikowaną ścieżkę złożenia zawierającą poprawne przestrzenie nazw. Zawinąłbym ją w funkcję wywoływaną podczas uruchamiania aplikacji.

<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>

Następnie możesz wdrożyć swoje narzędzie bez żadnych dodatkowych plików.

Wygląda bardziej „trudniej” niż myślałem, ale dzięki i tak. Dam temu szansę. Alex
9

Procedura Alexa do osadzenia zespołu.

Dodaj żądany zespół (stdlib.dll) do zasobów projektu.
Idź doZasoby zakładkę Właściwości projektu i wybierzDodaj zasób> Dodaj istniejący plik ...Przełącz naPodanie kartę i kliknijWyświetl zdarzenia aplikacji przycisk.

Dodaj ten kod doApplicationEvents.vb otwierający się kod.

<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>

Teraz skompiluj swój projekt, a zależny zestaw zostanie włączony do wyjścia jako pojedynczy plik.

Zauważ, że czasami możesz mieć zależny zespół w folderze wyjściowym. Dzieje się tak, ponieważ VS jest wstępnie skonfigurowany do kopiowania wszystkich zależnych zespołów na ścieżkę wyjściową. Możesz to zmienić, przechodząc doReferencje kartę właściwości projektu, a następnie ustawKopiuj lokalnie właściwość zależnego zespołu doFałszywy. Spowoduje to, że zespół nie zostanie skopiowany do katalogu wyjściowego.

Potencjalnie głupie pytanie: dlaczego wybranie Embedded Resource w opcji budowania nie robi tego za ciebie? Innymi słowy: dlaczego wymagany jest dowolny kod? Maury Markowitz
@ AlexEssilfie Hmm. Chciałbym, aby Microsoft wdrożył prostsze rozwiązanie w samym VS lub coś podobnego. Sree
Mała notatka dla osób zastanawiających się: Zastąpić"the name of your assembly" z dokładną nazwą Zgromadzenia, tak jak w kodzie. Jeśli tak jestMicrosoft.WindowsAPICodePack, wtedy wartość ciągu będzie"Microsoft.WindowsAPICodePack". Sree
@MauryMarkowitz: Jedynym powodem, dla którego mogę myśleć, jest ...Ponieważ tak to działa. Rozważ to ... struktura .NET wykonuje wiele zadań ładowania zespołów, jeśli zostawisz je jako pliki DLL w ścieżce EXE lub innej standardowej ścieżce. Jeśli jednak zdecydujesz się na Embedded Resource, framework nie ma możliwości sprawdzenia, czy zasób jest zespołem, który chcesz załadować w czasie wykonywania, czy też jest to coś, z czym chcesz pracować w inny sposób. Dlatego polega na tym, że powiesz, gdzie znajduje się pożądany zespół, a zatem musisz napisać cały ten kod. Alex Essilfie

Powiązane pytania