2009-12-30 9 views
12

J'ai ws2008 x64 avec vs2008.sgen.exe x64 .net C# échoue avec "assemblage avec un format incorrect"

Quand je mets mon vs à 64 bits (parce que j'ai dll 64bits) et sgen de compilation d'exécution dit que

Une tentative a été faite pour charger un assemblage avec un format incorrect

VS Takse sgen de C : \ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ bin \

et je pense qu'il devrait prendre de C: \ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ bin \ x64 \

lorsque je ke 64bit version de sgen et le mettre dans C: \ Program Files \ Microsoft SDK \ Windows \ v6.0A \ bin \ (remplacer la version 32 bits). J'étais capable de compiler.

Que dois-je faire pour pointer vers la version correcte de sgen sous contre

Puis-je configurer les plates-formes en quelque sorte solutinon pour un projet pour pointer vers le sgens correct (x86 32 bits et 64 bits à 64 bits version sgen)?

+0

Déjà discuté dans ce fil: http://stackoverflow.com/questions/1978340/visualstudio-c-x64-why-addreference-option-net-tab-points-to-x86-dll-instead/1978612#1978612 –

+1

Pas complètement, question ici est sur la façon de forcer VS à utiliser x64 sgen et l'autre est en quelque sorte connecté mais différent. – Darqer

Répondre

3

C'est la meilleure réponse que j'ai pu trouver: Conditional Post-Build Event Command for x64 sgen, un article de blog par Michael Hanes.

Utilisez un événement post construction, que les contrôles conditionnel si le 64 bits SGEN est installé et utiliser en cas de besoin:

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

Ceci est destiné à être un remplacement pour le réglage déroulant « Générer des Assemblées sérialisation » pour "On" pour un projet Visual Studio donné.

4

Cela vous aide-t-il? Jetez un oeil à la section où il uses sgen as a post build:

En conséquence, vous devez ajouter la commande sgen comme un événement post-build personnalisé sur l'onglet Événements de génération de vos propriétés du projet 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

Ajoutez une petite action de pré-construction juste pour vider les variables d'environnement qui sont en vigueur au moment de la construction.

Vérifiez vcvarsall.bat et suivez-le car il charge d'autres chauves-souris pour différents combos hôte/plateforme.

Vérifiez la durée réelle du processus devenv (par exemple avec l'explorateur de processus).

1

Il y a une autre solution affichée sur this blog post sur la spécification __SdkSgenTool conditionnelle:

La seule chose qui manque est que je ne dois mettre SGenToolPath à mon répertoire de construction de sortie. Cela a été plus difficile que prévu car, en tant que propriété normale, elle a été écrasée par d'autres tâches MsBuild. La solution qui a finalement fonctionné était de créer la propriété déjà existante et de définir la valeur à sa valeur finale lorsqu'aucune autre tâche ne pouvait interférer.

Voici le "code" pour que Sgen fonctionne en 64 bits.Vous devez définir la variable __SdkSgenTool dans tous les modes de construction, car les étapes de post-construction comme copy sont exécutées quel que soit le mode de construction.

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

J'ai entendu dire que ce problème sera résolu avec VS2012 ce qui est une bonne chose .

Cela ne semble pas être corrigé dans VS2012. Je voudrais utiliser cela avec prudence, car __SdkSgenTool semble être une propriété interne, et donc pas quelque chose sur lequel vous pouvez compter.