Как встроить dll из "проекта класса" в мой проект в vb.net
У меня есть стандартный проект "библиотеки классов" с набором классов, которые я использую для импорта почти во все мои новые проекты.
Я работаю над созданием нового Решения с пустым проектом, который является моим основным проектом, и затем я добавляю к решению упомянутый проект библиотеки классов, таким образом я могу видеть оба проекта в Soluction Explorer и даже видеть код библиотеки. или обновите его, если необходимо. Затем я пишу код в моем основном проекте и компилирую.
Это приводит меня к 2 файлам при компиляции: файл *.exe и stdlib.dll
В некоторых случаях я использую lib для очень маленьких инструментов, которые я хочу перераспределить по простой и понятной причине, поэтому я хотел бы встроить stdlib.dll, сгенерированный из моего проекта библиотеки классов, в мой файл *.exe.
Я почти уверен, что должна быть причина для этого в моем Microsoft Visual Basic 2010 Express, но я не знаю как.
Любое предложение?
Большое спасибо заранее.
2 ответа
Вот более "пошаговая" версия процедуры Алекса для встраивания сборки.
- Добавьте нужную сборку (stdlib.dll) к ресурсам проекта.
Перейдите на вкладку Ресурсы в Свойствах проекта и выберите Добавить ресурс> Добавить существующий файл... - Перейдите на вкладку " Приложение " и нажмите кнопку " Просмотр событий приложения".
Добавьте этот код в открывшийся код 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
Теперь скомпилируйте ваш проект, и вы получите зависимую сборку, включенную в вывод в виде одного файла.
Обратите внимание, что иногда у вас может быть зависимая сборка в выходной папке. Это связано с тем, что 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
Затем вы можете развернуть свой инструмент без каких-либо дополнительных файлов.