Incrustando .dlls – Asamblea resolviendo en C #

Tengo un .dll que estoy intentando incrustar como un recurso dentro de un ejecutable. Las siguientes dos preguntas son algo útiles, pero no son una ayuda completa:

Incrustar ensamblajes dentro de otro ensamblaje

Esto no parece funcionar como está escrito; args.Name no se puede usar como está escrito, pero incluso si está arreglado, el progtwig aún se queja de que falta un archivo .dll, lo que indica que el ensamblaje no está correctamente cargado.

Incrustar DLLs en un ejecutable comstackdo

y el enlace en una de las respuestas de:

http://codeblog.larsholm.net/2011/06/embed-dlls-easily-in-a-net-assembly/

Sin embargo, no hay ningún archivo “App.xaml *” en mi proyecto de ningún tipo, no estoy usando WPF; Estoy usando WinForms para mi ejecutable (cambiar no es realmente una opción, debido a la naturaleza del ejecutable).

Por lo tanto, estoy buscando un conjunto completo de instrucciones para incrustar una biblioteca de clases en un ejecutable como recurso y cargar ese archivo .dll del recurso, sin necesidad de un archivo .dll fuera del recurso incrustado.

Por ejemplo, ¿sería práctico simplemente agregar un archivo “App.xaml” a un proyecto de WinForms o habría interacciones negativas de las que no estoy al tanto?

Gracias.

Editar: Esto es lo que estoy usando actualmente:

///  /// Stores the very few things that need to be global. ///  static class AssemblyResolver { ///  /// Call in the static constructor of the startup class. ///  public static void Initialize( ) { AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler( Resolver ) ; } ///  /// Use this to resolve assemblies. ///  ///  ///  ///  public static Assembly Resolver( object sender, ResolveEventArgs args ) { Assembly executingAssembly = Assembly.GetExecutingAssembly( ) ; if ( args.Name == null ) throw new NullReferenceException( "Item name is null and could not be resolved." ) ; if ( !executingAssembly.GetManifestResourceNames().Contains( "Many_Objects_Display.Resources." + new AssemblyName( args.Name ).Name.Replace( ".resources", ".dll" ) ) ) throw new ArgumentException( "Resource name does not exist." ) ; Stream resourceStream = executingAssembly.GetManifestResourceStream( "Many_Objects_Display.Resources." + new AssemblyName( args.Name ).Name.Replace( ".resources", ".dll" ) ) ; if ( resourceStream == null ) throw new NullReferenceException( "Resource stream is null." ) ; if ( resourceStream.Length > 104857600) throw new ArgumentException( "Exceedingly long resource - greater than 100 MB. Aborting..." ) ; byte[] block = new byte[ resourceStream.Length ] ; resourceStream.Read( block, 0, block.Length ) ; Assembly resourceAssembly = Assembly.Load( block ) ; if ( resourceAssembly == null ) throw new NullReferenceException( "Assembly is a null value." ) ; return resourceAssembly ; } } 

Necesitas poner el código en tu punto de entrada principal. Algo como esto:

 class Program { static Program() { AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); } static void Main(string[] args) { // what was here is the same } static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { // the rest of sample code } } 

No puede simplemente agregar un archivo App.xaml a una aplicación de formularios de Windows.

También ese código de muestra para CurrentDomain_AssemblyResolve es extraño, primero probaría este código. No lo he probado, pero se parece más al código que he usado antes.