2009-12-30 16 views
12

मेरे पास बनाम 2008 के साथ ws2008 x64 है।sgen.exe x64 .net C# "गलत प्रारूप के साथ असेंबली" के साथ विफल रहता है

जब मैं सेट मेरी 64 बनाम (क्योंकि मैं 64 बिट DLLs है) और चलाने के संकलन sgen का कहना है कि

का प्रयास गलत प्रारूप

वी.एस. सी से sgen takse साथ एक विधानसभा लोड करने के लिए बनाया गया था : \ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ बिन \

और मुझे लगता है कि यह सी से ले जाना चाहिए: \ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ बिन \ 64 \

जब मैं टा केजेन के 64 बिट संस्करण और इसे सी: \ प्रोग्राम फ़ाइलें \ माइक्रोसॉफ्ट एसडीके \ विंडोज \ v6.0A \ bin \ (32 बिट संस्करण को प्रतिस्थापित करें) में डाल दें। मैं संकलन करने में सक्षम था।

क्या मैं बनाम

तहत sgen का सही संस्करण को इंगित करने के मैं किसी भी तरह solutinon प्लेटफार्मों कॉन्फ़िगर कर सकते हैं एक परियोजना सही sgens लिए 64 बिट के लिए 32 बिट के लिए और 64 के लिए 86 के लिए (बात करने के लिए के लिए क्या करना चाहिए sgen संस्करण)?

+0

पहले से ही इस धागे में चर्चा की गई है: http://stackoverflow.com/questions/1978340/visualstudio-c-x64-why-addreference-option-net-tab-points-to-x86-dll-instead/1978612#1978612 –

+1

पूरी तरह से नहीं, सवाल यह है कि वीएस को 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)" 

यह इरादा नहीं है "उत्पन्न क्रमबद्धता सभाओं" ड्रॉप-डाउन सेटिंग के लिए एक स्थानापन्न होना करने के लिए किसी दिए गए विजुअल स्टूडियो प्रोजेक्ट के लिए "ऑन" के लिए।

4

क्या इससे आपकी मदद मिलती है? खंड पर एक नजर डालें, जहां वह uses sgen as a post build:

एक परिणाम है कि आप अपने वी.एस. परियोजना संपत्तियों के घटनाक्रम बिल्ड टैब पर एक कस्टम के बाद निर्माण घटना के रूप में SGen आदेश जोड़ने की जरूरत के रूप में:

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

2

निर्माण समय पर प्रभावी रूप से env vars को बाहर निकालने के लिए बस थोड़ा पूर्व-निर्माण कार्रवाई जोड़ें।

vcvarsall.bat की जांच करें और इसका अनुसरण करें क्योंकि यह विभिन्न होस्ट/बिल्ड प्लेटफ़ॉर्म combos के लिए अन्य bat-s लोड करता है।

डेवेन प्रक्रिया के वास्तविक प्रत्यक्षदर्शी की जांच करें (प्रक्रिया एक्सप्लोरर के साथ कहें)।

1

वहाँ एक अलग समाधान this blog post पर तैनात __SdkSgenTool सशर्त निर्दिष्ट करने के बारे में है:

केवल लापता बात यह है कि मैं अपने निर्माण उत्पादन निर्देशिका के लिए SGenToolPath निर्धारित करने की आवश्यकता है। यह एक सामान्य संपत्ति के रूप में अपेक्षित था क्योंकि यह अन्य एमएसबिल्ड कार्यों द्वारा ओवरराइट किया गया था। आखिरकार जिस समाधान ने काम किया था वह पहले से ही मौजूदा संपत्ति बनाना था और मूल्य को इसके अंतिम मूल्य पर सेट करना था जब कोई अन्य कार्य हस्तक्षेप नहीं कर सकता था।

नीचे 64 बिट में Sgen काम करने के लिए "कोड" है।आपको सभी बिल्ड मोड में __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 एक आंतरिक संपत्ति प्रतीत होता है, और इसलिए ऐसा कुछ नहीं जिसे आप भरोसा कर सकते हैं।

संबंधित मुद्दे