Pregunta sobre vb.net, dll – Cómo incrustar dll de "proyecto de clase" en mi proyecto en vb.net

4

Tengo un proyecto de "biblioteca de clases" estándar con un conjunto de clases que uso para importar en casi todos mis nuevos proyectos.

La forma en que trabajo es crear una nueva Solución con un proyecto vacío, que es mi proyecto principal, y luego agrego a la solución el proyecto de biblioteca de clases mencionado, de esta manera puedo ver los dos proyectos en el Explorador de solución e incluso ver el código de la biblioteca. o actualizarlo si es necesario. Luego escribo el código en mi proyecto principal y lo compilo.

Esto me lleva a tener 2 archivos cuando compilo: archivo * .exe y stdlib.dll

En algunos casos, uso la biblioteca para herramientas muy pequeñas que quiero redistribuir de manera fácil y limpia, por eso me gustaría incrustar el archivo stdlib.dll generado desde mi proyecto de biblioteca de clases en mi archivo * .exe.

Estoy bastante seguro de que debe haber un por qué hacer esto en mi Microsoft Visual Basic 2010 Express pero no sé cómo.

¿Cualquier sugerencia?

Muchas gracias de antemano.

stackoverflow.com/questions/27891550/…  funciona igual con vb.net bigworld12

Tu respuesta

2   la respuesta
9

Aquí hay una versión más 'paso a paso' deEl procedimiento de alex Para incrustar el montaje.

Agregue el ensamblaje deseado (stdlib.dll) a los recursos del proyecto.
Ve a laRecursos pestaña de las propiedades del proyecto y elijaAgregar recurso> Agregar archivo existente ...Cambiar a laSolicitud pestaña y haga clic en elVer eventos de aplicación botón.

Agregue este código a laAplicacionesEventos.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>

Ahora compile su proyecto y tendrá el ensamblaje dependiente incorporado en la salida como un solo archivo.

Tenga en cuenta que a veces puede tener el ensamblaje dependiente en la carpeta de salida. Esto se debe a que VS está preconfigurado para copiar todos los conjuntos dependientes en la ruta de salida. Puedes anular esto yendo a laReferencias pestaña de las propiedades del proyecto y luego establecer laCopia local propiedad de la asamblea dependiente deFalso. Esto evitará que el ensamblaje se copie en el directorio de salida.

@MauryMarkowitz: la única razón por la que puedo pensar es ...Porque así es como funciona. Considere esto ... .NET Framework hace mucho trabajo al cargar ensamblajes si los deja como archivos DLL en la ruta EXE o en otra ruta estándar. Sin embargo, si decide incrustarlo, el marco no tiene forma de saber si el recurso es un ensamblaje que desea cargar en tiempo de ejecución o si es algo con lo que desea trabajar de otra manera. Por lo tanto, depende de usted que le diga dónde está el ensamblaje deseado y, por lo tanto, la necesidad de escribir todo este código. Alex Essilfie
Pregunta potencialmente estúpida: ¿por qué la selección de Recurso incrustado en la Opción de compilación lo hace por usted? Dicho de otra manera: ¿por qué se requiere algún código? Maury Markowitz
Una pequeña nota para aquellos que se preguntan: Reemplazar"the name of your assembly" con el nombre exacto de la Asamblea, como escribiría en el código. Si el nombre esMicrosoft.WindowsAPICodePack, entonces el valor de la cadena será"Microsoft.WindowsAPICodePack". Sree
@AlexEssilfie Hmm. Desearía que Microsoft implementara una solución más simple en VS en sí, o algo similar. Sree
1

Puedes insertar tuAssembly (.dll en su caso) en su proyecto seleccionando "Agregar archivo existente" y luego cambie la Opción de compilación a "Recursos incrustados".

A continuación, agregue unHandler Para elAppDomain.CurrentDomain.AssemblyResolve evento que se activa tan pronto como accede por primera vez a la biblioteca dentro de su código.

El código del controlador se ve así: (Observe la ruta de ensamblaje completamente calificada, que incluye los espacios de nombre correctos. Lo envolvería en una función que se llama al inicio de su aplicación.

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

A continuación, puede implementar su herramienta sin ningún archivo adicional.

Parece más "complicado" de lo que pensaba, pero gracias de todos modos. Lo probaré. Alex

Preguntas relacionadas