Pergunta sobre vb.net, dll – Como incorporar dll de "projeto de classe" no meu projeto em vb.net

4

Eu tenho um projeto de "biblioteca de classes" padrão com um conjunto de classes que eu uso para importar em quase todos os meus novos projetos.

A maneira como eu trabalho é criar uma nova solução com um projeto vazio, que é o meu projeto principal, e então adiciono à solução o projeto de biblioteca de classes mencionado, assim posso ver os dois projetos no Soluction Explorer e até ver o código da biblioteca ou atualize-o se necessário. Então escrevo o código no meu projeto principal e compilo.

Isso me levou a ter 2 arquivos quando eu compilar: arquivo * .exe e stdlib.dll

Alguns casos eu uso o lib para ferramentas muito pequenas que eu quero redistribuir de uma forma fácil e limpa porque, então eu gostaria de incorporar o stdlib.dll gerado a partir do meu projeto de biblioteca de classe em meu arquivo * .exe.

Tenho certeza que deve haver um motivo para fazer isso no meu Microsoft Visual Basic 2010 Express, mas não sei como.

Alguma sugestão?

Muito obrigado em avançado.

stackoverflow.com/questions/27891550/…  funciona mesmo com vb.net bigworld12

Sua resposta

2   a resposta
1

Você pode incorporar seuAssembly (.dll no seu caso) em seu projeto, selecionando "Add existing file" (Adicionar arquivo existente) e, em seguida, altere a opção Build para "Embedded Ressource".

Você então adiciona umHandler para oAppDomain.CurrentDomain.AssemblyResolve evento que é acionado assim que você acessa a biblioteca dentro do seu código.

Esse código do manipulador se parece com isso: (Observe o caminho de montagem totalmente qualificado inclusive os namespacs corretos. Eu o colocaria em uma função que é chamada na inicialização do seu aplicativo.

<code>   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
</code>

Você pode então implantar sua ferramenta sem nenhum arquivo adicional.

Parece mais "mais complicado" do que eu pensava, mas obrigado mesmo assim. Vou dar uma chance. Alex
9

Aqui está uma versão mais "passo-a-passo"Procedimento de Alex para incorporar a montagem.

Adicione o assembly desejado (stdlib.dll) aos recursos do projeto.
Vou aoRecursos guia das propriedades do projeto e escolhaAdicionar Recurso> Adicionar Arquivo Existente ...Mude para oAplicação guia e clique noVisualizar eventos do aplicativo botão.

Adicione este código aoApplicationEvents.vb código que se abre.

<code>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 
</code>

Agora compile seu projeto e você terá o assembly dependente incorporado na saída como um único arquivo.

Observe que às vezes você pode ter o assembly dependente na pasta de saída. Isso ocorre porque o VS é pré-configurado para copiar todos os assemblies dependentes para o caminho de saída. Você pode substituir isso, indo para oReferências guia das propriedades do projeto e, em seguida, definir oCopiar local propriedade do assembly dependente paraFalso. Isso impedirá que o conjunto seja copiado para o diretório de saída.

Uma pequena nota para quem se pergunta: Substituir"the name of your assembly" com o nome exato da montagem, como você digitaria código. Se o nome éMicrosoft.WindowsAPICodePack, então o valor da string será"Microsoft.WindowsAPICodePack". Sree
@AlexEssilfie Hmm. Eu gostaria que a Microsoft implementasse uma solução mais simples no próprio VS, ou algo similar. Sree
Pergunta potencialmente estúpida: por que não selecionar Embedded Resource na Build Opção faz isso por você? Em outras palavras: por que qualquer código é necessário? Maury Markowitz
@MauryMarkowitz: A única razão pela qual consigo pensar é ...Porque é assim que funciona. Considere isso ... o .NET Framework faz muito trabalho carregando assemblies se você os deixar como arquivos DLL no caminho EXE ou em algum outro caminho padrão. Se, no entanto, você decidir incorporar ao Recurso Integrado, o framework não terá como saber se o recurso é um assembly que você deseja carregar em tempo de execução ou se é algo com o qual deseja trabalhar de qualquer outra maneira. Por isso, depende de você dizer onde está a montagem desejada e, portanto, a necessidade de escrever todo esse código. Alex Essilfie

Perguntas relacionadas