7

我有一个标准的“类库”项目,其中包含一组用于在几乎所有新项目中导入的类。

我的工作方式是用一个空项目创建一个新的解决方案,这是我的主项目,然后我将提到的类库项目添加到解决方案中,这样我可以在解决方案资源管理器中看到这两个项目,甚至可以看到库代码或根据需要进行更新。然后我在我的主项目中编写代码并进行编译。

这导致我在编译时有 2 个文件:文件*.exestdlib.dll

在某些情况下,我将 lib 用于非常小的工具,我想以简单明了的方式重新分发这些工具,因此我想将stdlib.dll生成的类库项目嵌入到我的*.exe文件中。

我很确定在我的 Microsoft Visual Basic 2010 Express 中必须有这样做的原因,但我不知道怎么做。

有什么建议吗?

4

2 回答 2

15

这是亚历克斯嵌入程序集的更“分步”版本。

  1. 将所需的程序集 (stdlib.dll) 添加到项目的资源中。
    转到项目属性的资源选项卡,然后选择添加资源 > 添加现有文件...
  2. 切换到应用程序选项卡并单击查看应用程序事件按钮。
  3. 将此代码添加到打开的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 
    
  4. 现在编译您的项目,您将把依赖程序集作为单个文件合并到输出中。

请注意,有时您可能在输出文件夹中有依赖程序集。这是因为 VS 已预先配置为将所有依赖程序集复制到输出路径。您可以通过转到项目属性的References选项卡来覆盖它,然后将依赖程序集的Copy Local属性设置为False。这将阻止程序集被复制到输出目录。

于 2012-04-20T20:39:34.307 回答
2

您可以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

然后,您无需任何其他文件即可部署您的工具。

于 2012-04-05T08:52:41.247 回答