2009-12-30 2 views
12

vs2008에 ws2008 x64가 있습니다.sgen.exe x64 .net "잘못된 형식의 어셈블리"와 함께 C#이 실패 함

나는 설정하면 내 64에 대 (I은 64 비트 DLL을 가지고 있기 때문에) 및 실행 컴파일 sgen는

시도가

VS는 C 에서 sgen takse 잘못된 형식의 어셈블리를로드하려고했습니다 말한다 : \ 프로그램 파일 \은 Microsoft SDKs \ 윈도우 \ v6.0A \ 빈

와 나는 그것이 C에서 그것을 가지고해야한다고 생각 \ : \ 프로그램 파일 \은 Microsoft SDKs \ 윈도우 \ v6.0A \ 빈 \ 64 \

i 타 64 비트 버전의 sgen을 C : \ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ bin \ (32 비트 버전 대체)에 넣으십시오. 나는 컴파일 할 수 있었다.

내가 한 프로젝트가 64 비트의 x64 32 비트 및 x86 용에 대한 (올바른 sgens를 가리 키도록 내가 어떻게 든 solutinon 플랫폼을 구성 할 수 있습니다 대

에서 sgen의 올바른 버전을 가리 키도록해야한다 sgen 버전)?

+0

이미이 스레드에서 논의되었습니다. http://stackoverflow.com/questions/1978340/visualstudio-c-x64-why-addreference-option-net-tab-points-to-x86-dll-instead/1978612#1978612 –

+1

충분하지 않은 질문은 여기에서 VS가 x64 sgen을 강제로 사용하고 다른 하나가 어떻게 든 연결되어 있지만 다른 것입니다. – Darqer

답변

3

내가 찾을 수있는 가장 좋은 답변은 Conditional Post-Build Event Command for x64 sgen이고 블로그 게시물은 Michael Hanes입니다.

는, 그 조건 검사가 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 프로젝트에 대해 "On"으로 설정합니다.

4

도움이 될까요? 섹션에서 봐 그가 어디 uses sgen as a post build :

"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sgen.exe" /force /assembly:"$(TargetPath)" /compiler:/keycontainer:VS_KEY_5EFB7881D71082EDCF85DBBFCD748B9A /compiler:/delaysign-

: 당신이 당신의 VS 프로젝트 속성의 빌드 이벤트 탭에 사용자 지정 빌드 후 이벤트로 SGen 명령을 추가 할 필요가 결과적으로

2

빌드 할 때 적용되는 env 변수를 덤프하려면 약간 사전 빌드 작업을 추가하십시오.

vcvarsall.bat를 확인하고 다른 호스트/빌드 플랫폼 콤보에 대한 다른 박쥐를로드 할 때이를 따르십시오.

devenv 프로세스의 실제 비트 수를 확인하십시오 (예 : 프로세스 탐색기 사용).

1

조건부 __SdkSgenTool 지정에 대한 this blog post에 게시 된 다른 해결책이있다 :

유일한 누락 된 것은 내 빌드 출력 디렉터리에 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은 내부 속성 인 것으로 보이므로 의존 할 수있는 것이 아니기 때문에주의해서 사용해야합니다.

관련 문제