I have a standard "class library" project with a set of classes that I use to import in almost all my new projects.
The way I work is creating a new Solution with an empty project, which is my main project, and then I add to the solution the mentioned class library project, this way I can see both projects in the Soluction Explorer and even see the library code or update it if needed. Then I write the code in my main project and I compile.
This lead me to have 2 files when I compile: file *.exe
and stdlib.dll
Some cases I use the lib for very small tools that I want to redistribute in a easy and clean why, so I would like to embed the stdlib.dll
generated from my class library project into my *.exe
file.
I'm pretty sure there must be a why to do this in my Microsoft Visual Basic 2010 Express but I don't know how.
Any Suggestion?
Solution 1Add a reference to the DLL directly to your new project: open your project in VS, expand the Project branch in the Solution explorer, then right click "References". From the context menu, select "Add Reference..." and wait for the dialog - If can take a little while to appear.
Browse to the CallMeFromVB. dll file ( located in either the release folder or Debug folder of the project ). Select it and click OK. This imports the C# library into our VB.NET project.
Here is a more 'step-by-step' version of Alex's procedure to embedding the assembly.
Add this code to the ApplicationEvents.vb code that opens.
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
Now compile your project and you'll have the dependent assembly incorporated into the output as a single file.
Note that sometimes you may have the dependent assembly in the output folder. This is because VS is preconfigured to copy all dependent assemblies to the output path. You can override this by going to the References tab of the project's properties and then set the Copy Local property of the dependent assembly to False. This will stop the assembly from being copied to the output directory.
You can embedd your Assembly
(.dll in your case) into your project by selecting "Add existing file" and then change the Build Option to "Embedded Ressource".
You then add a Handler
for the AppDomain.CurrentDomain.AssemblyResolve
event which gets fired as soon as you first access the library inside your code.
That handler code looks like this: (Notice the fully qualified assembly path inclusive correct namespacs. I'd wrap it in a function which gets called on startup of your application.
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
You can then deploy your tool without any additional files.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With