2009-05-13 9 views
5

मेरे पास एक विजुअल स्टूडियो प्रोजेक्ट है जो कई डीएलएल संदर्भों पर निर्भर करता है।मेरी अनुमति के बिना निर्माण के दौरान डीएलएल की प्रतिलिपि रोकने के लिए विजुअल स्टूडियो कैसे प्राप्त करें?

<ItemGroup> 
    <Reference Include="Class1.Project1"> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>..\bin\Class1.Project1.dll</HintPath> 
    <Private>False</Private> 
    </Reference> 
    <Reference Include="Class1.Project2"> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>..\bin\Class1.Project2.dll</HintPath> 
    <Private>False</Private> 
    </Reference> 
</ItemGroup> 

हालांकि, जब मैं एक वेब साइट परियोजना में एक परियोजना निर्भरता के रूप में इस वर्ग में शामिल हैं, दृश्य स्टूडियो ऊपर दिखाए गए निर्भरता की निर्भरता रही है: यहाँ मेरी csproj में उन लोगों के संदर्भ का एक नमूना है। बिल्ड स्टूडियो स्टूडियो के दौरान "स्थानीय स्थानीय प्रतिलिपि" संपत्ति को "ट्रू" में डिफॉल्ट कर रहा है और इन निर्भरताओं को मेरी वेबसाइट की ~/bin निर्देशिका में कॉपी कर रहा है।

यह बदले में, इस निर्देशिका में मौजूद DLL फ़ाइलों के संस्करणों को ओवरराइट कर रहा है।

Could not load file or assembly 'Class5.Project5, Version=3.6.1861.2, Culture=neutral, PublicKeyToken=dfeaee0e3978ac79' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

मैं कैसे दृश्य स्टूडियो डिफ़ॉल्ट "कॉपी स्थानीय" सब कुछ के लिए करने के लिए "गलत" की स्थापना करते हैं: यह निम्न त्रुटि का कारण बनता है? मैं नहीं चाहता कि विजुअल स्टूडियो बिल्डिंग के दौरान स्वचालित रूप से डीएलएल फाइलों की प्रतिलिपि बनाएँ। न ही मैं अपने निर्माण को पर बहुत डीएलएल के विशिष्ट संस्करणों से जोड़ना चाहता हूं। मौजूदा dll फ़ाइलों पर लेखन के लिए उन्हें केवल पठनीय के रूप में स्थापित करने के लिए है को रोकने के लिए सबसे आसान तरीका है:

उत्तर

1

मैं इस समस्या को एक बार,

पर प्रकाशित था। आपको प्रत्येक फाइल के लिए प्रकाशित करने पर एक चेतावनी मिलेगी जिसे प्रतिस्थापित नहीं किया जा सका लेकिन यह काम करेगा।

बिल्ड पर: कॉपीलोकल स्वचालित रूप से बंद करने के लिए आपको जीएसी पर डीएलएल फाइलों को रखने की आवश्यकता है।

0

बिन निर्देशिका में पहले से ही अन्य संस्करण क्यों थे?

किसी भी मामले में, मुझे आश्चर्य है कि आपको वेब एप्लिकेशन प्रोजेक्ट का उपयोग करके एक ही समस्या मिल जाएगी। चूंकि यह एक प्रोजेक्ट है, इसमें एक ही फ़ाइल है जो प्रत्यक्ष संदर्भों को सूचीबद्ध करती है, और यदि ये परियोजना संदर्भ हैं (उसी समाधान में अन्य असेंबली के आउटपुट के संदर्भ), तो एमएसबीयूआईएलडी यह सुनिश्चित कर सकता है कि सही संस्करण का उपयोग किया जाए।

देखें कि क्या आप इसे एक नया वेब एप्लिकेशन प्रोजेक्ट शुरू करके और केवल संदर्भ जोड़कर पुन: पेश कर सकते हैं।

2

यह मुझे लगता है कि आपके पास एक ही निर्देशिका में आउटपुट करने के लिए कई परियोजनाएं कॉन्फ़िगर की गई हैं - क्या यह सच है?

यदि ऐसा है, तो आपको विजुअल स्टूडियो मानते हैं (nay, की आवश्यकता है) के रूप में आपको अपनी कॉन्फ़िगरेशन की समीक्षा करने की आवश्यकता होगी कि प्रत्येक प्रोजेक्ट में एक अद्वितीय आउटपुट निर्देशिका होती है।

इसके अलावा, आप ने लिखा है:

This, in turn, is overwriting the versions of the DLL files that already exist in this directory.

जहां इन मौजूदा फ़ाइलों से आया?

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

(दुर्भाग्य से, मैं अनुभव से बोलते हैं। आह।)

+0

वीएस प्रत्येक परियोजना को एक अद्वितीय आउटपुट निर्देशिका रखने की आवश्यकता नहीं है। जहां मैं काम करता हूं हमारे पास 1,000 से अधिक प्रोजेक्ट हैं जो सब कुछ टोए एकल बिन निर्देशिका आउटपुट करते हैं। (यह चाल इस आउटपुट निर्देशिका से आपके संदर्भ बनाने के लिए है।) हम नैन का उपयोग बिल्ड की पूर्व शर्त को पॉप्युलेट करते हैं और डीबग और रिलीज बिल्ड के बीच आउटपुट निर्देशिका को साफ करते हैं। यह शायद सबसे अच्छा अभ्यास नहीं है, लेकिन यह निश्चित रूप से काम करता है। –

+0

बहुत दिलचस्प! जब मैंने कोशिश की, वीएस2003 के साथ, मैंने पाया कि संकलन विफल हुआ क्योंकि आउटपुट निर्देशिका में फ़ाइलें उपयोग में थीं, एक परियोजना द्वारा खुलती थी जब कोई चीजों को साफ़ करने की कोशिश कर रहा था। आप विजुअल स्टूडियो का किस संस्करण का उपयोग कर रहे हैं? – Bevan

0

आप अपने प्रोजेक्ट फ़ाइल में निम्न की कोशिश कर सकते।

<ReferenceOutputAssembly>false</ReferenceOutputAssembly> 

और फिर, अपने कोड में इसे आजमाएं।

<ItemGroup> 
    <Reference Include="Class1.Project1"> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>..\bin\Class1.Project1.dll</HintPath> 
    <ReferenceOutputAssembly>false</ReferenceOutputAssembly> 
    </Reference> 
    <Reference Include="Class1.Project2"> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>..\bin\Class1.Project2.dll</HintPath> 
    <ReferenceOutputAssembly>false</ReferenceOutputAssembly> 
    </Reference> 
</ItemGroup>