Как встроить dll из "проекта класса" в мой проект в vb.net

У меня есть стандартный проект "библиотеки классов" с набором классов, которые я использую для импорта почти во все мои новые проекты.

Я работаю над созданием нового Решения с пустым проектом, который является моим основным проектом, и затем я добавляю к решению упомянутый проект библиотеки классов, таким образом я могу видеть оба проекта в Soluction Explorer и даже видеть код библиотеки. или обновите его, если необходимо. Затем я пишу код в моем основном проекте и компилирую.

Это приводит меня к 2 файлам при компиляции: файл *.exe и stdlib.dll

В некоторых случаях я использую lib для очень маленьких инструментов, которые я хочу перераспределить по простой и понятной причине, поэтому я хотел бы встроить stdlib.dll, сгенерированный из моего проекта библиотеки классов, в мой файл *.exe.

Я почти уверен, что должна быть причина для этого в моем Microsoft Visual Basic 2010 Express, но я не знаю как.

Любое предложение?

Большое спасибо заранее.

2 ответа

Решение

Вот более "пошаговая" версия процедуры Алекса для встраивания сборки.

  1. Добавьте нужную сборку (stdlib.dll) к ресурсам проекта.
    Перейдите на вкладку Ресурсы в Свойствах проекта и выберите Добавить ресурс> Добавить существующий файл...
  2. Перейдите на вкладку " Приложение " и нажмите кнопку " Просмотр событий приложения".
  3. Добавьте этот код в открывшийся код Application Events.vb.

    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 
    
  4. Теперь скомпилируйте ваш проект, и вы получите зависимую сборку, включенную в вывод в виде одного файла.

Обратите внимание, что иногда у вас может быть зависимая сборка в выходной папке. Это связано с тем, что VS предварительно сконфигурирован для копирования всех зависимых сборок в выходной путь. Вы можете переопределить это, перейдя на вкладку " Ссылки " в свойствах проекта, а затем установите для свойства " Копировать локально" зависимой сборки значение " Ложь". Это остановит сборку от копирования в выходной каталог.

Вы можете встроить свой Assembly (.dll в вашем случае) в ваш проект, выбрав "Добавить существующий файл", а затем измените параметр сборки на "Встроенный ресурс".

Затем вы добавляете Handler для AppDomain.CurrentDomain.AssemblyResolve событие, которое запускается, как только вы впервые получаете доступ к библиотеке внутри вашего кода.

Этот код обработчика выглядит следующим образом: (Обратите внимание на полный путь сборки, включая правильные пространства имен. Я бы обернул его в функцию, которая вызывается при запуске вашего приложения.

   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

Затем вы можете развернуть свой инструмент без каких-либо дополнительных файлов.

Другие вопросы по тегам