Подтвердить что ты не робот

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 бит)?

4b9b3361

Ответ 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 кажется внутренним свойством, и поэтому вы не можете положиться на него.