sgen.exe x64 .net c # не работает при сборке с неправильным форматом

У меня 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)?


person Darqer    schedule 30.12.2009    source источник
comment
Уже обсуждалось в этой теме: stackoverflow.com/questions/1978340/   -  person Hans Passant    schedule 30.12.2009
comment
Не полностью, вопрос здесь в том, как заставить VS использовать x64 sgen, а другой как-то связан, но отличается.   -  person Darqer    schedule 31.12.2009


Ответы (4)


Это лучший ответ, который я смог найти: 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.

person Mike Atlas    schedule 17.08.2010

Вам это помогает? Взгляните на раздел, в котором он использует 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-

person Gary L Cox Jr    schedule 11.08.2010

Добавьте небольшое действие перед сборкой, чтобы выгрузить переменные окружения, которые действуют во время сборки.

Проверьте vcvarsall.bat и следуйте ему, пока он загружает другие bat-файлы для различных комбинаций хоста / платформы сборки.

Проверьте фактическую разрядность процесса devenv (например, с помощью проводника процессов).

person ZXX    schedule 12.08.2010

В этом сообщении блога опубликовано другое решение об условном указании __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, похоже, является внутренним свойством и, следовательно, не является чем-то, на что вы можете положиться.

person ashes999    schedule 28.05.2015