У меня ws2008 x64 с vs2008.
Когда я устанавливаю vs на x64 (потому что у меня 64-битные библиотеки DLL) и запускаю компиляцию, sgen говорит, что
Была сделана попытка загрузить сборку с неправильным форматом
VS takse sgen из C: \ Program Files \ Microsoft SDK \ Windows \ v6.0A \ bin \
и я думаю, что надо брать из C: \ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ bin \ x64 \
когда я беру 64-битную версию sgen и помещаю ее в C: \ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ bin \ (замените 32-битную версию). Я смог скомпилировать.
Что мне делать, чтобы указать правильную версию sgen в разделе vs.
Могу ли я как-то настроить платформы solutinon для одного проекта, чтобы они указывали на правильные sgens (для x86 на 32-битную и для x64 на 64-битную версию sgen)?
Ответ 1 · рейтинг 3 · Mike Atlas
Это лучший ответ, который я смог найти: Conditional Post- Build Event Command for x64 sgen, сообщение в блоге Майкла Хейнса.
Используйте событие пост-сборки, которое условно проверяет, установлен ли 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)"
Это предназначено для замены раскрывающегося меню "Создать сборки сериализации" для параметра "Вкл." Для данного проекта Visual Studio.
Ответ 2 · рейтинг 4 · Gary L Cox Jr
Вам это помогает? Взгляните на раздел, в котором он использует sgen в качестве пост-сборки :
Как следствие, вам необходимо добавить команду SGen в качестве настраиваемого события после сборки на вкладке 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 · рейтинг 2 · ZXX
Добавьте небольшое действие перед сборкой, чтобы выгрузить переменные окружения, которые действуют во время сборки.
Проверьте vcvarsall.bat и следуйте ему, пока он загружает другие bat-файлы для различных комбинаций хоста / платформы сборки.
Проверьте фактическую разрядность процесса devenv (например, с помощью проводника процессов).
Ответ 4 · рейтинг 1 · ashes999
В этом сообщении блога опубликовано другое решение об условном указании __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, похоже, является внутренним свойством и, следовательно, не является чем-то, на что вы можете положиться.