2009-12-30 6 views
12

Ho ws2008 x64 con vs2008.sgen.exe x64 .net C# non riesce con "assembly con un formato errato"

Quando ho impostato il mio vs per x64 (perché ho DLL a 64 bit) e la compilazione run Sgen dice che

Si è tentato di caricare un assembly con un formato non corretto

VS Takse SGEN da C : \ Program Files \ Microsoft SDK \ Windows \ v6.0A \ bin \

e penso che dovrebbe prendere da C: \ Program Files \ Microsoft SDK \ Windows \ v6.0A \ bin \ x64 \

quando i ta versione a 64 bit di sgen e inserirla in C: \ Programmi \ Microsoft SDK \ Windows \ v6.0A \ bin \ (sostituire la versione a 32 bit). Sono stato in grado di compilare.

Cosa devo fare per puntare alla versione corretta di Sgen sotto vs.

Posso in qualche modo configurare piattaforme solutinon per un progetto per puntare al sgens corretti (per x86 a 32 bit e per x64 a 64 bit versione sgen)?

+0

Già discusso in questo thread: http://stackoverflow.com/questions/1978340/visualstudio-c-x64-why-addreference-option-net-tab-points-to-x86-dll-instead/1978612#1978612 –

+1

Non completamente, la domanda qui è su come forzare VS a usare x64 sgen e l'altra è in qualche modo connessa ma diversa. – Darqer

risposta

3

Questa è la migliore risposta che ho trovato: Conditional Post-Build Event Command for x64 sgen, un post sul blog di Michael Hanes.

Utilizzare un post evento di compilazione, che i controlli condizionalmente se il 64 bit SGEN è installato, e utilizzarlo quando necessario:

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

Questo è destinato a essere un sostituto per l'impostazione a discesa "Genera serializzazione Assemblies" per "On" per un determinato progetto Visual Studio.

4

Questo ti aiuta? Date un'occhiata alla sezione dove uses sgen as a post build:

Di conseguenza è necessario aggiungere il comando SGEN come un evento personalizzato post-generazione della scheda Eventi di compilazione delle vostre proprietà del progetto 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

Aggiungi una piccola azione pre-compilazione solo per scaricare env vars in vigore al momento della compilazione.

Controllare vcvarsall.bat e seguirlo mentre carica altri bat-s per diverse combinazioni di host/build.

Verificare la vera testimonianza del processo di devenv (ad esempio con Process Explorer).

1

C'è una soluzione diversa postato su this blog post sulla specifica __SdkSgenTool condizionale:

L'unica cosa che manca è che ho bisogno di impostare SGenToolPath alla mia directory di output di compilazione. Questo è stato più difficile come previsto poiché come una proprietà normale è stata sovrascritta da altre attività di MsBuild. La soluzione che alla fine ha funzionato è stata quella di creare la proprietà già esistente e impostare il valore sul suo valore finale quando nessun'altra attività potrebbe interferire.

Di seguito è riportato il "codice" per far funzionare Sgen a 64 bit.È necessario definire la variabile __SdkSgenTool in tutte le modalità di costruzione poiché i passaggi di generazione post come la copia vengono eseguiti indipendentemente dalla modalità di generazione.

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

Ho sentito dire che questo problema verrà risolto con VS2012 che è una buona cosa .

Questo non sembra essere risolto in VS2012. Lo userei con cautela, perché __SdkSgenTool sembra essere una proprietà interna e quindi non è qualcosa su cui puoi fare affidamento.

Problemi correlati