我有一个标准的“类库”项目,其中包含一组用于在几乎所有新项目中导入的类。
我的工作方式是创建一个带有空项目的新解决方案,这是我的主要项目,然后我向解决方案中添加了提到的类库项目,这样我就可以在Soluction Explorer中看到这两个项目甚至看到库代码或根据需要更新它。然后我在我的主项目中编写代码并编译。
这使我在编译时有2个文件:file * .exe和stdlib.dll
在某些情况下,我将lib用于非常小的工具,我想以简单明了的方式重新分发,所以我想将我的类库项目生成的stdlib.dll嵌入到我的* .exe文件中。
我很确定在我的Microsoft Visual Basic 2010 Express中必须有这样做的原因,但我不知道如何。
有任何建议吗?
非常感谢先进。
答案 0 :(得分:10)
以下是嵌入程序集的Alex's procedure的“逐步”版本。
将此代码添加到打开的 ApplicationEvents.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已预先配置为将所有从属程序集复制到输出路径。您可以通过转到项目属性的引用选项卡来覆盖它,然后将依赖程序集的复制本地属性设置为 False 。这将阻止程序集被复制到输出目录。
答案 1 :(得分:1)
您可以选择“添加现有文件”,然后将构建选项更改为“嵌入式资源”,将Assembly
(在您的案例中为.dll)嵌入到项目中。
然后为Handler
事件添加AppDomain.CurrentDomain.AssemblyResolve
,一旦您第一次访问代码中的库,就会被触发。
该处理程序代码如下所示:(注意完全限定的程序集路径包含正确的namespacs。我将它包装在一个函数中,该函数在启动应用程序时被调用。
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
然后,您可以在不使用任何其他文件的情况下部署工具。