2010-07-30 23 views
10

Por mi vida, parece que mi aplicación .NET 4 no se puede combinar correctamente con ILMerge. Incluso después de establecer/targetplatform,/lib,/ndebug y al agregar un archivo ILMerge.exe.config personalizado, el archivo de salida no funciona correctamente (no parece ser capaz de "buscar" las bibliotecas fusionadas).Serio problema con ILMerge y .NET 4.0

He intentado this y this inútilmente. Ni siquiera puedo hacerlo construir a menos que use el archivo de configuración, pero cuando lo hago no funciona. Sin el archivo de configuración, obtengo de forma consistente el mensaje de error "Referencia de ensamblaje sin resolver no permitida: PresentationFramework".

aquí es el estado actual de mi mando ILMerge siendo utilizado como un evento posterior construcción:

ilmerge.exe /out:C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\bin\Release\OrangeNote.exe 
    /ndebug /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 
    /lib:"C:\Windows\Microsoft.NET\Framework\v4.0.30319" 
    /lib:"C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies" 
    "C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\obj\Release\OrangeNote.exe" 
    "C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\..\..\..\Libraries\Lucene.Net\src\Lucene.Net\bin\Release\Lucene.Net.dll" 
    "C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\..\..\..\Libraries\Ookii.Dialogs\src\Ookii.Dialogs.Wpf\bin\Release\Ookii.Dialogs.Wpf.dll" 
    "C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\..\..\..\Libraries\SharpZipLib\bin\ICSharpCode.SharpZipLib.dll" 
    "C:\Users\Logan\Documents\Visual Studio 2010\Projects\HumanInterfaceProject\HumanInterfaceProject\bin\Release\HipLib.dll" 

Alguna idea de lo que estoy haciendo mal ??

+4

Lo resuelvo simplemente agregando: /lib:"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\WPF " –

Respuesta

8

Una sugerencia que he visto para combinar .dlls en WPF es simplemente agregar el dll como un recurso incrustado en el proyecto y luego cargar programáticamente el dll en el ensamblado.

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { 

    String resourceName = "AssemblyLoadingAndReflection." + 

     new AssemblyName(args.Name).Name + ".dll"; 

    using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) { 

     Byte[] assemblyData = new Byte[stream.Length]; 

     stream.Read(assemblyData, 0, assemblyData.Length); 

     return Assembly.Load(assemblyData); 

    } 

}; 

véase: http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx

+0

¡Esto es genial, gracias! Incluso Mike Barnett (el autor de ILMerge) considera que esto es una solución, por lo que es lo suficientemente bueno para mí. :) – devios1

+1

Tenga en cuenta que esto hace que sea imposible para Ngen los archivos dll. – Peter

+0

Esto no funciona para las bibliotecas de clases: desplácese hacia abajo para ver el comentario de Jeffrey Ritcher sobre esto en el enlace de la respuesta, el comentario está fechado el 28 de julio de 2010 a las 3:14 p. M. – Dean

3

Me di cuenta de que uno de sus ensamblajes se llama "dialogs.wpf". Actualmente, ILMerge no fusiona correctamente los ensamblados con los recursos de WPF.

No hay mucha información al respecto, pero this forum post menciona una posible solución, y hay varias posibilidades mencionadas en answers to this question, pero la sugerencia más votada es solo para comprar una alternativa comercial - No sé si eso es una posibilidad para ti.

Hay un discussion here que explica por qué no funciona, y hay una sugerencia here that changing the resource reference in the xaml may help solve the problem.

+0

No creo que haya En realidad, cualquier recurso de WPF en esa asamblea, pero no estoy del todo seguro (lo verificaré cuando llegue a casa). Mi ejecutable principal ciertamente lo hace, pero ese no parece ser el problema. Todavía voy a analizar esto más a fondo. Gracias por la respuesta. – devios1

7

Envié un correo electrónico a Mike Barnett, el autor de ILMerge y me explicó que, lamentablemente, no está diseñado para funcionar con aplicaciones WPF, y me sorprendió cuando le dije que lo tenía trabajando con mi aplicación WPF 3.5. Como en realidad no es compatible, solo escribiré esto por el momento y esperaré a que se presente otra alternativa.

Como nota al margen, probé .NET Reactor de Eziriz, y realmente funcionó muy bien, pero cuesta $ 180 que para un proyecto de hobby no estoy dispuesto a gastar todavía. Pero eso es mucho más barato que la otra alternativa comercial de Red Gate, así que pensé en mencionarlo.

Actualización: Mike Barnett considera ahora la mejor respuesta como respuesta aceptada a esta pregunta. Según él, si hubiera sabido que era posible, nunca habría escrito ILMerge en primer lugar.

+0

Buena información. Gracias por la respuesta. –

+0

Como usuario comercial de .NET Reactor, debo mencionar que siempre he fallado al fusionar ensamblajes. Pareció haberse fusionado con éxito, pero cuando ejecuta la aplicación fusionada, encontrará actividades extrañas. – Ying

+0

Pareció que funcionaba bien cuando acepté * solo * para incrustar (no fusionar), y no tenía nada de sofisticado material de seguridad. Hice un recorrido por mi programa y todo parecía intacto. – devios1

6

Si bien es cierto que ILMerge no actualiza cadenas de recursos WPF, que puede usarse para unir conjuntos con referencias WPF pasando el directorio de montaje de referencia en lugar del directorio de ejecución de /targetplatform, como tal: /targetplatform:v4,"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Client" (para el Perfil de cliente .NET 4.0).

Lo uso para combinar en Rx System.Reactive.dll, que tiene una referencia a Dispatcher, pero no tiene ningún recurso real de WPF.

8

Usted podría tratar de Costura.

https://github.com/Fody/Costura#how-it-works

Es básicamente toma Jeffrey Richter appraoch

http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx

pero lo hace de una manera que usted no necesita escribir ningún código. es decir, no es necesario escribir el método "AssemblyResolve"

+0

Esto parece tener un enlace roto. Pero Costura ahora es un paquete NuGet como complemento de Fody. http://www.nuget.org/packages/Costura.Fody/ – Corylulu

+1

@Corylulu corregido – Simon