2009-12-30 43 views
12

Tengo ws2008 x64 con vs2008.sgen.exe x64 .net C# falla con "ensamblado con un formato incorrecto"

Cuando puse mi frente a x64 (porque tengo DLL de 64 bits) y sgen proceso de compilación dice que se hizo

Un intento de cargar un ensamblado con un formato incorrecto

VS takse Sgen de C : \ archivos de programa \ Microsoft SDKs \ Windows \ v6.0A \ bin \

y creo que debería tomar desde C: \ archivos de programa \ Microsoft SDKs \ Windows \ v6.0A \ bin \ x64 \

cuando estoy ke versión de 64 bits de sgen y colóquela en C: \ Archivos de programa \ Microsoft SDKs \ Windows \ v6.0A \ bin \ (reemplace la versión de 32 bits). Pude compilar.

¿Qué debo hacer para que apunte a la versión correcta de sgen bajo vs.

¿Hay algún modo configurar plataformas solutinon para un proyecto para que apunte a las sgens correctas (para x86 de 32 bits y para x64 a 64 bits versión sgen)?

+0

Ya he comentado en este hilo: http://stackoverflow.com/questions/1978340/visualstudio-c-x64-why-addreference-option-net-tab-points-to-x86-dll-instead/1978612#1978612 –

+1

No completamente, la pregunta aquí es sobre cómo forzar a VS a usar x64 sgen y el otro de alguna manera está conectado pero es diferente. – Darqer

Respuesta

3

Esta es la mejor respuesta que pude encontrar: Conditional Post-Build Event Command for x64 sgen, una publicación de blog por Michael Hanes.

Utilice un evento posterior a la construcción, que los controles condicional si se ha instalado el 64 bits SGEN, y utilizarlo cuando sea necesario:

REM Use the 64-bit sgen from the Win 2008 and 
REM .NET 3.5 SDK in a 64-bit dev environment 
REM ProgramFiles variable is set to 
REM 'Program Files (x86)' in a x64 environment 
REM Processor_Architecture variable returns x86 
REM in both an x86 and x64 environment within VS. 

if /I "%ProgramFiles%" == "C:\Program Files" (
set SgenToolPath="C:\Program Files\Microsoft 
SDKs\Windows\v6.0A\Bin\sgen.exe" 
) else (
set SgenToolPath="C:\Program Files\Microsoft 
SDKs\Windows\v6.1\Bin\x64\sgen.exe" 
) 

%SgenToolPath% /compiler:"\"/keyfile:$(ProjectDir) 
MyKeyFile.snk"\" /force "$(TargetPath)" 

Este pretende ser un reemplazo para el ajuste desplegable "generar ensamblados de serialización" para "Activado" para un proyecto de Visual Studio determinado.

4

¿Esto te ayuda? Echar un vistazo a la sección donde uses sgen as a post build:

Como consecuencia es necesario agregar el comando Sgen como un evento personalizado posterior a la generación en la pestaña Eventos de generación de las propiedades del proyecto VS:

"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sgen.exe" /force /assembly:"$(TargetPath)" /compiler:/keycontainer:VS_KEY_5EFB7881D71082EDCF85DBBFCD748B9A /compiler:/delaysign-

2

Agregue un poco de acción previa a la compilación solo para eliminar los archivos que están en vigor en el momento de la compilación.

Comprueba vcvarsall.bat y síguelo mientras carga otros bat-s para diferentes combinaciones de host/plataforma de compilación.

Comprueba la bitness real del proceso devenv (digamos con el explorador de procesos).

1

Hay una solución diferente publicado en this blog post sobre la especificación de __SdkSgenTool condicionalmente:

Lo único que faltaba es que yo necesito fijar SGenToolPath a mi directorio de salida de generación. Esto fue más difícil de lo esperado ya que como propiedad normal fue sobrescrito por otras tareas de MsBuild. La solución que finalmente funcionó fue crear la propiedad ya existente y establecer el valor a su valor final cuando ninguna otra tarea podía interferir.

A continuación se muestra el "código" para hacer que Sgen trabaje en 64 bits.Debe definir la variable __SdkSgenTool en todos los modos de compilación ya que los pasos posteriores a la compilación, como copiar, se ejecutan independientemente del modo de compilación.

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'"> 
    .... 
    <GenerateSerializationAssemblies>On</GenerateSerializationAssemblies> 
    <SGenUseProxyTypes>false</SGenUseProxyTypes> 
    <__SdkSgenTool Condition="exists('C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\x64\sgen.exe')">C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\x64\sgen.exe</__SdkSgenTool> 
    <__SdkSgenTool Condition="exists('C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\x64\sgen.exe')">C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\x64\sgen.exe</__SdkSgenTool> 
    </PropertyGroup> 
... 

    <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> 
    <Target Name="BeforeBuild"> 
    <Copy SourceFiles="$(__SdkSgenTool)" DestinationFiles="$(TargetDir)\sgen.exe" SkipUnchangedFiles="true" /> 
    <CreateProperty Value="$(TargetDir)"> 
     <Output TaskParameter="Value" PropertyName="SGenToolPath" /> 
    </CreateProperty> 

he oído que este problema se solucionará con VS2012 que es una buena cosa .

Esto no parece estar solucionado en VS2012. Usaría esto con precaución, porque __SdkSgenTool parece ser una propiedad interna y, por lo tanto, no es algo en lo que pueda confiar.

Cuestiones relacionadas