Sgen.exe x64.net С# не работает с "сборкой с неправильным форматом"
У меня есть ws2008 x64 с vs2008.
Когда я устанавливаю свой vs на x64 (потому что у меня 64-разрядные DLL) и запускаю компиляцию, sgen говорит, что
Была сделана попытка загрузить сборку с неправильным форматом
VS takse sgen from
C:\Program Files\Microsoft SDK\Windows\v6.0A\bin\
и я думаю, что он должен
C:\Program Files\Microsoft SDK\Windows\v6.0A\bin\x64\
когда я беру 64-разрядную версию sgen и помещаю ее в C:\Program Files\Microsoft SDK\Windows\v6.0A\bin\(замените 32-разрядную версию). Я смог скомпилировать.
Что мне делать, чтобы указать правильную версию sgen под vs.
Можно ли каким-либо образом настроить платформы solutinon для одного проекта, чтобы указать на правильные sgens (для x86 до 32 бит и для версии с 64 до 64 бит)?
Ответы
Ответ 1
Это лучший ответ, который я мог бы найти: Команда условного постпострочного события для x64 sgen, сообщение в блоге Майкл Ханес.
Используйте событие post build, которое условно проверяет, установлен ли 64-разрядный SGEN, и используйте его при необходимости:
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)"
Это предназначено для замены выпадающего меню "Создать сериализацию сборок" для "On" для данного проекта Visual Studio.
Ответ 2
Помогает ли это вам? Взгляните на раздел, где он использует sgen как пост-сборку:
Как следствие, вам нужно добавить команду SGen как пользовательское событие post-build на вкладке Build Events свойств вашего VS-проекта:
"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sgen.exe" /force /assembly:"$(TargetPath)" /compiler:/keycontainer:VS_KEY_5EFB7881D71082EDCF85DBBFCD748B9A /compiler:/delaysign-
Ответ 3
Добавьте небольшое предварительное действие, чтобы сбрасывать env vars, которые действуют во время сборки.
Проверьте vcvarsall.bat и следуйте за ним, поскольку он загружает другие bat-ы для разных комбайнов платформы хоста/сборки.
Проверьте фактическую битсу процесса devenv (скажем, с помощью проводника процессов).
Ответ 4
В другом блоге в этом сообщении в блоге было указано другое определение __SdkSgenTool
условно:
Единственное, что я не вижу, это то, что мне нужно установить SGenToolPath в мою выходную директорию сборки. Это было труднее, чем ожидалось, поскольку в качестве обычного свойства он был перезаписан другими задачами MsBuild. Решение, которое в конечном итоге работало, состояло в том, чтобы создать уже существующее свойство и установить значение в его окончательное значение, когда никакие другие задачи не могут помешать.
Ниже приведен "код", чтобы заставить Sgen работать на 64 бит. Вам нужно определить переменную __SdkSgenTool во всех режимах сборки, поскольку шаги пост-сборки, такие как копирование, выполняются независимо от режима сборки.
<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>
Я слышал, что этот вопрос будет исправлен с VS2012, который является хорошим вещь.
В VS2012 это не исправлено. Я бы использовал это с осторожностью, потому что __SdkSgenTool
кажется внутренним свойством, и поэтому вы не можете положиться на него.