2012-07-10 11 views
5

Estoy intentando crear una versión combinada de FakeItEasy que incluya Castle.Core. Leí sobre ILMerge y parecía que era la solución que necesitaba. Después de descargar y compilar FakeItEasy, copié todos los archivos que necesitaba (FakeItEasy.dll (.NET4), Castle.Core.dll (.NET4), ilmerge.exe, FakeItEasy.snk) en la misma carpeta. entonces me encontré con el siguiente comando:Creación de una biblioteca firmada con ILMerge throwing exception

ilmerge 
    /keyfile:FakeItEasy.snk 
    /out:..\FakeItEasy.dll 
    /t:library 
    /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 
    FakeItEasy.dll Castle.Core.dll 

y obtuvo el siguiente resultado:

An exception occurred during merging:                
An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)                         
    at System.Compiler.Writer.MscorsnStrongNameSignatureGeneration(String wszFilePath, String wszKeyContainer, Byte[] pbKeyBlob, Int32 cbKeyBlob, IntPtr ppbSignatureBlob, IntPtr pcbSignatureBlob) 
    at System.Compiler.Writer.WritePE(String location, Boolean writeDebugSymbols, Module module, Boolean delaySign, String keyFileName, String keyName)            
    at System.Compiler.Writer.WritePE(CompilerParameters compilerParameters, Module module)   
    at ILMerging.ILMerge.Merge()                 
    at ILMerging.ILMerge.Main(String[] args) 

Si dejo fuera de la "/keyfile:FakeItEasy.snk" el conjunto fusionado se crea muy bien, pero eso no me ayuda, ya que necesito una versión firmada.

También he probado la especificación de la plataforma de destino como:

/targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 

pero los resultados fueron los mismos.

+1

Oye, encontraste una respuesta a esto porque estoy teniendo el mismo problema. – Confused

+0

Nunca lo resolvió. Terminamos usando la versión de FakeItEasy distribuida a través de NuGet, por lo que el problema desapareció. –

+0

Una solución alternativa que funcionó para mí fue 'corflags ilmerge/32bitreq +/force' para que funcione en modo de 32 bits en lugar de 64 bits. – jnm2

Respuesta

2

Recientemente me encontré con este problema al configurar un proyecto en una máquina nueva que ejecuta Windows 8 de 64 bits. Anteriormente estaba desarrollando en una máquina virtual Windows 7 de 32 bits y no tuve ningún problema. El comando ILMerge se está ejecutando como un evento posterior a la construcción. Dado que Visual Studio es un proceso de 32 bits, también pude replicar el comportamiento en un indicador de comandos de Visual Studio de 32 bits en el equipo con Windows 8 de 64 bits utilizando el mismo comando ILMerge que se utilizó en el evento posterior a la construcción.

ILMerge.exe 
    /keyfile:public.snk 
    /targetplatform:"v4,C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0" 
    /t:exe 
    /ndebug 
    /out:Result.exe Source.exe Other.dll 

que he hecho una buena cantidad de trabajo de interfaz de aplicaciones .NET y C++ bibliotecas nativas, así que estoy muy familiarizado con el mensaje de excepción An attempt was made to load a program with an incorrect format. Esto indica un problema de valor de bits, donde, por ejemplo, una de 32 bits proceso intenta cargar una biblioteca de 64 bits. Esa situación exacta es lo que creo que está sucediendo aquí. Dado que esta es una máquina de 64 bits, también probé el comando ILMerge en un símbolo del sistema de Visual Studio de 64 bits. Curiosamente, pero no sorprendentemente, el mismo comando que genera la excepción en el indicador de 32 bits funciona bien en el aviso de 64 bits.

Estoy usando un archivo snk que contiene solo información de clave pública durante el desarrollo, por lo que estoy retrasando la firma del ensamblado fusionado. Luego miré los interruptores de comando disponibles para ILMerge y descubrí el interruptor /delaysign. Agregar este modificador al comando ILMerge alivia el problema cuando se ejecuta ILMerge desde un proceso de 32 bits.

ILMerge.exe 
    /keyfile:public.snk 
    /delaysign 
    /targetplatform:"v4,C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0" 
    /t:exe 
    /ndebug 
    /out:Result.exe Source.exe Other.dll 

Lo que es aún más interesante es que cuando se utiliza un archivo de SNK con un par pública/privada completa clave, el comando ILMerge funciona muy bien sin el interruptor /delaysign. Por lo tanto, parece que la excepción se genera cuando se usa un archivo snk con solo información de clave pública y cuando ILMerge se inicia desde un proceso de 32 bits.

0

Comencé a recibir este error cuando actualicé a VS 2015 desde VS 2013 e intenté construir un proyecto que siempre se había construido bien (ILMerge se ejecuta como parte de la compilación). La respuesta anterior me recordó que las claves privadas requieren acceso administrativo. Entonces recordé que mi nuevo acceso directo VS 2015 no estaba configurado para "Ejecutar como administrador". Una vez que reinicié VS 2015 como administrador, la parte de ILMerge de la compilación funcionó bien.

Cuestiones relacionadas