2009-12-30 33 views
12

Tôi có ws2008 x64 với vs2008.sgen.exe x64 .net C# không thành công với "assembly có định dạng không chính xác"

Khi tôi đặt tôi vs để x64 (vì tôi có dlls 64bit) và chạy biên soạn sgen nói rằng

Một cố gắng đã được thực hiện để nạp một assembly với một định dạng không đúng

VS takse sgen từ C : \ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ bin \

và tôi nghĩ rằng nó nên lấy nó từ C: \ Program Files \ Microsoft SDK \ Windows \ v6.0A \ bin \ x64 \

khi tôi ta ke phiên bản 64bit của sgen và đặt nó vào C: \ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ bin \ (thay thế phiên bản 32bit). Tôi đã có thể biên dịch.

Những gì tôi nên làm gì để trỏ đến các phiên bản đúng của sgen dưới vs

Tôi có thể bằng cách nào đó cấu hình nền tảng solutinon cho một dự án để trỏ đến sgens đúng (cho x86 32 bit và cho x64 64 bit Phiên bản sgen)?

+0

Đã được thảo luận trong chủ đề này: http://stackoverflow.com/questions/1978340/visualstudio-c-x64-why-addreference-option-net-tab-points-to-x86-dll-instead/1978612#1978612 –

+1

Không hoàn toàn, câu hỏi ở đây là về làm thế nào để lực lượng VS để sử dụng x64 sgen và một trong những khác là bằng cách nào đó kết nối nhưng khác nhau. – Darqer

Trả lời

3

Đây là câu trả lời hay nhất tôi có thể tìm thấy: Conditional Post-Build Event Command for x64 sgen, bài đăng trên blog theo số Michael Hanes.

Sử dụng một sự kiện bài build, rằng séc có điều kiện nếu 64 bit sgen được cài đặt, và sử dụng nó khi cần thiết:

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)" 

này được thiết kế để thay thế cho "Tạo serialization Assemblies" thiết lập thả xuống cho "On" cho một dự án Visual Studio đã cho.

4

Điều này có giúp ích cho bạn không? Hãy nhìn vào phần nơi ông uses sgen as a post build:

Như một hệ quả bạn cần phải thêm lệnh sgen như một tùy chỉnh sau sự kiện xây dựng trên tab Build Sự kiện bất động sản dự án VS của bạn:

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

2

Thêm một chút hành động dựng sẵn chỉ để loại bỏ các vv env có hiệu lực vào thời gian xây dựng.

Kiểm tra vcvarsall.bat và làm theo nó khi tải các trình dơi khác cho các combo nền tảng máy chủ/nền tảng khác nhau.

Kiểm tra độ bit thực tế của quá trình devenv (nói với trình khám phá quy trình).

1

Có một giải pháp khác nhau được đăng trên this blog post về quy định cụ thể điều kiện __SdkSgenTool:

Điều duy nhất còn thiếu là tôi cần phải thiết lập SGenToolPath vào thư mục build đầu ra của tôi. Đây là khó khăn hơn như mong đợi vì là một tài sản bình thường nó đã bị ghi đè bởi các nhiệm vụ MsBuild khác. Giải pháp cuối cùng đã làm việc là tạo thuộc tính đã tồn tại và đặt giá trị thành giá trị cuối cùng của nó khi không có tác vụ nào khác có thể can thiệp.

Dưới đây là “mã” để làm cho Sgen hoạt động trong 64 bit.Bạn cần xác định biến __SdkSgenTool trong tất cả các chế độ xây dựng kể từ khi các bước xây dựng bài đăng như bản sao được thực hiện bất kể chế độ xây dựng.

<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> 

Tôi nghe nói rằng vấn đề này sẽ được khắc phục với VS2012, điều tốt là .

Điều này dường như không cố định trong VS2012. Tôi sẽ sử dụng điều này một cách thận trọng, bởi vì __SdkSgenTool dường như là một tài sản nội bộ, và do đó không phải cái gì bạn có thể dựa vào.

Các vấn đề liên quan