2012-12-18 22 views
13

लोड नहीं कर सका, मैं आंतरिक उपयोग के लिए एक विजुअल स्टूडियो 2012 एक्सटेंशन लिख रहा हूं, जिसके लिए सभी असेंबली का मजबूत नाम है। मैं RestSharp (और कुछ अन्य डीएलएस) पर निर्भर हूं, और चूंकि इसे दृढ़ता से नामित नहीं किया गया है, इसलिए मैं this का पालन करके इसमें एक मजबूत नाम जोड़ रहा हूं। सब कुछ प्रक्रिया के आउटपुट के अनुसार काम करता है, और यहां तक ​​कि विजुअल स्टूडियो का दावा है कि अगर मैं प्रोजेक्ट संदर्भों में RestSharp.dll के गुणों को देखता हूं तो इसे दृढ़ता से नामित किया जाता है। हालांकि, जब मैं अपने एक्सटेंशन का उपयोग करने के लिए जाना मैं एक FileLoadException का दावा मिलती है:एक तृतीय पक्ष असेंबली का जोरदार नामकरण - फ़ाइल या असेंबली

Could not load file or assembly 'RestSharp, Version=104.1.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. A strongly-named assembly is required. (Exception from HRESULT: 0x80131044) 

कैसे उसके चारों ओर इस या काम को हल करने पर कोई विचार?

+0

'PublicKeyToken = null' से, यह एक * अहस्ताक्षरित * विधानसभा के संस्करण के लिए देख रहा है। मैं RestSharp के आपके सभी संदर्भों को हटा दूंगा, और उन्हें हस्ताक्षरित असेंबली में दोबारा जोड़ दूंगा। – vcsjones

+0

प्री-बिल्ड इवेंट में मैं ildasm ilasm चरण करता हूं और फिर प्रोजेक्ट का निर्माण करता हूं। चूंकि प्रोजेक्ट निर्दिष्ट पथ से डीएलएल का संदर्भ दे रहा है, जहां नया हस्ताक्षरित डीएल है, क्या उसके पास हस्ताक्षरित संस्करण नहीं होना चाहिए? क्या परियोजना संदर्भ वास्तव में हस्ताक्षर किए जाने चाहिए? मैंने माना होगा कि निर्माण के समय हस्ताक्षरित डीएलएल पर्याप्त होगा। – Adam

+4

'क्या परियोजना संदर्भ वास्तव में हस्ताक्षरित होना चाहिए?' हां। तथ्य के बाद इसे हस्ताक्षर करना पर्याप्त नहीं है। असेंबली आपके असेंबली के लिए प्रकट होता है * संदर्भ * रेस्टशर्प मजबूत नाम (या एक की अनुपस्थिति) सहित पूरी तरह से योग्य असेंबली नाम का ट्रैक रखता है। – vcsjones

उत्तर

0

कुछ बातें आप देख सकते हैं:

ऐसा लगता है आप परियोजना refrence अहस्ताक्षरित dll करने के लिए अभी भी है \ RestSharp.dll।। आपको अपने प्रोजेक्ट को हस्ताक्षरित \ Signed \ RestSharp.dll dll के विरुद्ध संकलित करना चाहिए। वर्तमान ताज़ा निकालें और फिर से जोड़ें।

अपनी परियोजना की बिन निर्देशिका में भी डीएलएल की जांच करें। यह संभव है कि पुराना RestSharp.dll अभी भी वहां है। इसे हटाएं और सभी निर्माण निर्देशिकाओं की जांच करें।

आप यह भी जांच सकते हैं कि restsharp.dll आपके जीएसी में है या नहीं। यदि ऐसा है तो अपने जीएसी से डीएल हटा दें।

1

मैंने VSPackage से RestSharp का उपयोग करने की कोशिश की और यह काम करता है। RestSharp जोड़ने के लिए मेरे कदम:

  1. एक परियोजना में NuGet द्वारा RestSharp जोड़ें जहां मैं इसका उपयोग करूंगा। ऐसा करने के लिए, समाधान एक्सप्लोरर में प्रोजेक्ट पर राइट-क्लिक करें और "NuGet पैकेज प्रबंधित करें ..." का चयन करें, RestSharp ढूंढें और इंस्टॉल बटन दबाएं। इस परियोजना में

  2. लिखें परीक्षण कोड:

    
    var test = new RestSharp.RestClient("http://test.com"); 
    Logger.Log(Category.Info, "Test {0}", test.BaseUrl); 
    
  3. NuGet द्वारा RestSharp जोड़े संस्थापक परियोजना में। इसी प्रकार अनुच्छेद 1. मैं VSIX Deployment Package का उपयोग करता हूं। आवश्यक असेंबली सेट करने के लिए बस VSIX परिनियोजन पैकेज में असेंबली का संदर्भ जोड़ने की आवश्यकता है। यह "NuGet संकुल प्रबंधित करें ..." कमांड बनाता है। जब आप वीएस विज़ार्ड द्वारा VSPackage बनाते हैं, तो VSPackage की मुख्य प्रोजेक्ट VSIX परिनियोजन पैकेज है।

    यदि आप स्थापना के किसी अन्य विधि का उपयोग करते हैं तो आपका वीएस एक्सटेंशन (उदाहरण के लिए, एमएसआई इंस्टॉलर), आपको हमारे इंस्टॉलेशन पैकेज में RestSharp.dll को स्पष्ट रूप से जोड़ने की आवश्यकता है।

एक परिणाम के रूप में, मैं लॉग में लाइन "टेस्ट http://test.com" मिला है।

आपके मामले में सबसे अधिक संभावना है कि RestSharp.dll स्थापित नहीं किया गया है और इसलिए VS को आपके मॉड्यूल को लोड करते समय RestSharp.dll नहीं मिल रहा है। या स्थापित RestSharp असेंबली का पूरी तरह से योग्य नाम परियोजना के संदर्भ में पूरी तरह से योग्य नाम असेंबली से अलग है। यह देखने के लिए कि क्या आपके एक्सटेंशन के फ़ोल्डर में RestSharp.dll फ़ाइल है (डिफ़ॉल्ट पैच द्वारा VSPackage के लिए "% LOCALAPPDATA% \ MICROSOFT \ VISUALSTUDIO \ 11.0EXP \ EXTENSIONS \ {YourCompanyName} \ {YourProductName} \ {YourProductVersion} \" है)। यदि आप डीबगर के तहत एक्सटेंशन चलाते हैं तो आप मॉड्यूल विंडो में अपने एक्सटेंशन के लिए पूर्ण पथ देख सकते हैं।

संपादित करें: मैंने अभी देखा है कि NuGet से RestSharp असेंबली का कोई मजबूत नाम नहीं है। इसलिए स्थापित एक्सटेंशन और परियोजनाओं के संदर्भों की निर्देशिका में एक मजबूत नाम के साथ एक ही असेंबली होनी चाहिए, और सब कुछ ठीक काम करेगा।

5

मैंने अपनी खुद की कुंजी के साथ तीसरे पक्ष के असेंबली मजबूत नामकरण में मदद के लिए एक NuGet समाधान स्तर पैकेज लिखा था।

यह आदेश इन संकुल जहां लेने वाली परियोजना दृढ़ता से नामित किया गया है से जोड़ने के लिए सक्षम होने के लिए में NuGet पैकेज कि अहस्ताक्षरित विधानसभाओं का उपयोग कर रहे हैं, की सामग्री को हस्ताक्षर करने के लिए लक्षित है। तक पहुंच मूल स्रोत कोड की आवश्यकता नहीं है, और आप अपनी खुद की मजबूत नामकरण कुंजी के साथ किसी असेंबली पर हस्ताक्षर कर सकते हैं। वांछित अगर आप देरी-हस्ताक्षर भी कर सकते हैं।

https://nuget.org/packages/Nivot.StrongNaming

आप अपने ब्लॉग पर इस बारे में अधिक पढ़ सकते हैं:

http://www.nivot.org/blog/post/2013/04/30/Signing-unsigned-assemblies-in-NuGet-packages

+0

हाय एक्सओएन, महान काम। मुझे एक समस्या है: जब मैं अपने उपकरण के साथ nuGet से किसी तृतीय पक्ष असेंबली पर हस्ताक्षर करता हूं तो सब कुछ ठीक काम करता है। लेकिन ऐसा लगता है कि वीएस को पुनरारंभ करने के बाद मुझे पुरानी त्रुटि संदेश मिल गया है और असेंबली पर हस्ताक्षर करने के लिए अपने टूल का फिर से उपयोग करना होगा। क्या मैं कुछ गलत कर रहा हूं या क्या मुझे सिर्फ अपनी परियोजना के प्री-बिल्ड-इवेंट में साइन इन करने के लिए आदेश देना है? आपकी मदद के लिए Thanx! – SolarX

+0

हम्म, शायद वीएस आउटपुट का पुनर्निर्माण कर रहा है क्योंकि ऐसा लगता है कि यह पुराना है? मुझे यकीन नहीं है ... क्षमा करें। – x0n

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