2009-12-30 11 views
12

Ich habe WS2008 x64 mit vs2008.sgen.exe x64 .net C# schlägt mit "Assembly mit einem falschen Format"

Wenn ich mein vs auf x64 (denn ich habe 64-Bit-DLLs) und Laufzusammenstellung sgen sagt, dass

Es wurde versucht, eine Baugruppe mit einem falschen Format

VS SGEN von C Takse zu laden : \ Programme \ Microsoft SDKs \ Windows \ V6.0A \ bin \

und ich denke, dass es es aus C nehmen sollten: \ Programme \ Microsoft SDKs \ Windows \ V6.0A \ bin \ x64 \

wenn ich ta ke 64bit Version von sgen und legen Sie es in C: \ Programme \ Microsoft SDKs \ Windows \ v6.0A \ bin \ (ersetzen 32-Bit-Version). Ich konnte kompilieren.

Was soll ich tun, um die richtige Version von sgen unter vs. Punkt

Kann ich konfigurieren irgendwie solutinon Plattformen für ein Projekt auf die richtigen sgens-zu-Punkt (für x86 zu 32 Bit und für x64 64-Bit sgen Version)?

+0

Bereits in diesem Thread diskutiert: http://StackOverflow.com/Questions/1978340/visualstudio-c-x64-why-Addreference-option-net-Tab-Points-in-x86-dll-instead/1978612#1978612 –

+1

Nicht vollständig, Frage hier ist, wie VS zwingen, x64 sgen zu verwenden und der andere ist irgendwie verbunden, aber anders. – Darqer

Antwort

3

Dies ist die beste Antwort, die ich finden konnte: Conditional Post-Build Event Command for x64 sgen, ein Blog-Post von Michael Hanes.

ein Beitrag Buildereignis verwenden, dass bedingt überprüft, ob die 64-Bit-SGEN installiert sind und es bei Bedarf verwenden:

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

Dies soll ein Ersatz für die „Gene Serialisierungsassemblys“ Drop-Down-Einstellung sein für "Ein" für ein bestimmtes Visual Studio-Projekt.

4

Hilft Ihnen das? Schauen Sie sich auf dem Abschnitt, wo er uses sgen as a post build:

Als Folge müssen Sie den SGen Befehl als benutzerdefinierte Post-Build-Ereignis auf dem Build-Registerkarte Ereignisse Ihres VS Projekteigenschaften hinzuzufügen:

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

2

Fügen Sie eine kleine Pre-Build-Aktion hinzu, um nur die zum Ausführungszeitpunkt gültigen env vars auszugeben.

Überprüfen Sie vcvarsall.bat und folgen Sie, wie es andere bat-s für verschiedene Host/Build-Plattform-Kombinationen lädt.

Überprüfen Sie die tatsächliche Bittenheit des Devenv-Prozesses (z. B. mit Process Explorer).

1

Es gibt eine andere Lösung auf this blog post geschrieben über __SdkSgenTool bedingt Angabe:

Die einzige fehlende Sache ist, dass ich SGenToolPath mein Build-Ausgabeverzeichnis einstellen muß. Dies war schwieriger als erwartet, da es als normale Eigenschaft von anderen MsBuild-Tasks überschrieben wurde. Die Lösung, die schließlich funktionierte, bestand darin, die bereits vorhandene Eigenschaft zu erstellen und den Wert auf seinen endgültigen Wert zu setzen, wenn keine anderen Aufgaben stören konnten.

Unten ist der "Code", um Sgen in 64 Bit arbeiten zu lassen.Sie müssen die Variable __SdkSgenTool in allen Build-Modi definieren, da die Post-Build-Schritte wie Kopieren unabhängig vom Build-Modus ausgeführt werden.

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

Ich habe gehört, dass dieses Thema mit VS2012 festgesetzt werden, die eine gute Sache.

Dies scheint in VS2012 nicht behoben zu sein. Ich würde dies mit Vorsicht verwenden, denn __SdkSgenTool scheint eine interne Eigenschaft zu sein, und daher kann man sich nicht darauf verlassen.