2012-07-10 24 views
5

मैं नकली इत्यादि का विलय संस्करण बनाने की कोशिश कर रहा हूं जिसमें Castle.Core शामिल है। मैंने आईएलएमर्ज के बारे में पढ़ा और ऐसा लगता था कि यह आवश्यक समाधान था। FakeItEasy को डाउनलोड करने और बनाने के बाद मैंने आवश्यक सभी फ़ाइलों की प्रतिलिपि बनाई (FakeItEasy.dll (.NET4), Castle.Core.dll (.NET4), ilmerge.exe, FakeItEasy.snk) एक ही फ़ोल्डर में। मैं तो निम्न आदेश भागा:आईएलएमर्ज फेंकने के अपवाद के साथ हस्ताक्षरित लाइब्रेरी बनाना

ilmerge 
    /keyfile:FakeItEasy.snk 
    /out:..\FakeItEasy.dll 
    /t:library 
    /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 
    FakeItEasy.dll Castle.Core.dll 

और निम्न परिणाम मिला:

An exception occurred during merging:                
An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)                         
    at System.Compiler.Writer.MscorsnStrongNameSignatureGeneration(String wszFilePath, String wszKeyContainer, Byte[] pbKeyBlob, Int32 cbKeyBlob, IntPtr ppbSignatureBlob, IntPtr pcbSignatureBlob) 
    at System.Compiler.Writer.WritePE(String location, Boolean writeDebugSymbols, Module module, Boolean delaySign, String keyFileName, String keyName)            
    at System.Compiler.Writer.WritePE(CompilerParameters compilerParameters, Module module)   
    at ILMerging.ILMerge.Merge()                 
    at ILMerging.ILMerge.Main(String[] args) 

अगर मैं "/keyfile:FakeItEasy.snk" विलय कर विधानसभा ठीक बनाई गई है को बंद रखना होगा, लेकिन वह मेरी मदद नहीं करता क्योंकि मुझे एक हस्ताक्षरित संस्करण की आवश्यकता है।

मैं भी रूप में लक्ष्य मंच निर्दिष्ट करने की कोशिश की है:

/targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 

लेकिन परिणाम एक ही थे।

+1

अरे, क्या आपको इसका उत्तर मिल गया क्योंकि मुझे एक ही समस्या का सामना करना पड़ रहा है। – Confused

+0

इसे कभी समझ नहीं आया। हम NuGet के माध्यम से वितरित FakeItEasy के संस्करण का उपयोग कर समाप्त हो गया, तो मुद्दा दूर चला गया। –

+0

मेरे लिए काम करने वाला एक वर्कअराउंड 64-बिट के बजाय 32-बिट मोड में चलाने के लिए 'corflags ilmerge/32bitreq +/force' था। – jnm2

उत्तर

2

मैंने हाल ही में विंडोज 8 64-बिट चलाने वाली एक नई मशीन पर एक प्रोजेक्ट स्थापित करते समय इस समस्या में भाग लिया। मैं पहले विंडोज 7 32-बिट वर्चुअल मशीन में विकसित कर रहा था और इसमें कोई समस्या नहीं थी। आईएलएमर्ज कमांड को पोस्ट-बिल्ड इवेंट के रूप में चलाया जा रहा है। चूंकि विजुअल स्टूडियो एक 32-बिट प्रक्रिया है, इसलिए मैं पोस्ट-बिल्ड इवेंट में उपयोग किए गए एक ही ILMerge कमांड का उपयोग कर विंडोज 8 64-बिट मशीन पर 32-बिट विजुअल स्टूडियो कमांड प्रॉम्प्ट में व्यवहार को दोहराने में सक्षम था।

ILMerge.exe 
    /keyfile:public.snk 
    /targetplatform:"v4,C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0" 
    /t:exe 
    /ndebug 
    /out:Result.exe Source.exe Other.dll 

मैं NET अनुप्रयोगों और देशी सी ++ पुस्तकालयों इंटरफ़ेस काम भी पर्याप्त मात्रा में किया है, इसलिए मैं अपवाद संदेश An attempt was made to load a program with an incorrect format. साथ बहुत परिचित हूँ यह एक bitness मुद्दे को इंगित करता है जहां, उदाहरण के लिए, एक 32-बिट प्रक्रिया 64-बिट लाइब्रेरी लोड करने का प्रयास करती है। यह सही स्थिति है जो मुझे विश्वास है कि यहां पर चल रहा है। चूंकि यह 64-बिट मशीन है, इसलिए मैंने 64-बिट विजुअल स्टूडियो कमांड प्रॉम्प्ट में ILMerge कमांड का भी प्रयास किया। दिलचस्प बात यह है कि, लेकिन पूरी तरह आश्चर्यजनक रूप से, 32-बिट प्रॉम्प्ट में अपवाद उत्पन्न करने वाला वही आदेश 64-बिट प्रॉम्प्ट में ठीक काम करता है।

मैं एक स्नैक फ़ाइल का उपयोग कर रहा हूं जिसमें विकास के दौरान केवल सार्वजनिक कुंजी जानकारी है, इसलिए मैं मर्ज किए गए असेंबली पर हस्ताक्षर करने में देरी कर रहा हूं। मैंने आईएलएमर्ज के लिए उपलब्ध कमांड स्विच को देखा और /delaysign स्विच की खोज की। ILMerge कमांड पर यह स्विच जोड़ना 32-बिट प्रक्रिया से ILMerge चलाते समय समस्या को कम करता है।

ILMerge.exe 
    /keyfile:public.snk 
    /delaysign 
    /targetplatform:"v4,C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0" 
    /t:exe 
    /ndebug 
    /out:Result.exe Source.exe Other.dll 

क्या और भी दिलचस्प है कि जब एक पूर्ण सार्वजनिक/निजी कुंजी जोड़ी के साथ एक SNK फ़ाइल का उपयोग कर, ILMerge आदेश /delaysign स्विच के बिना बस ठीक काम करता है है। तो ऐसा प्रतीत होता है कि केवल सार्वजनिक कुंजी जानकारी के साथ एक स्नैक फ़ाइल का उपयोग करते समय अपवाद उत्पन्न होता है और जब 32-बिट प्रक्रिया से ILMerge लॉन्च किया जाता है।

0

जब मैंने वीएस 2013 से वीएस 2015 में अपग्रेड किया तो मुझे यह त्रुटि मिलनी शुरू हुई और एक ऐसी परियोजना बनाने की कोशिश की जो हमेशा ठीक से बनाया गया था (ILMerge को बिल्ड के हिस्से के रूप में निष्पादित किया गया है)। उपर्युक्त उत्तर ने मुझे याद दिलाया कि निजी कुंजियों को प्रशासनिक पहुंच की आवश्यकता है। तब मुझे याद आया कि मेरा नया वीएस 2015 शॉर्टकट "व्यवस्थापक के रूप में चलाएं" पर सेट नहीं किया गया था। एक बार जब मैंने व्यवस्थापक के रूप में वीएस 2015 को पुनरारंभ किया, तो बिल्ड के आईएलएमर्ज हिस्से ने ठीक काम किया।