2011-10-01 3 views
9

मैं एक 2006 माइक्रोसॉफ्ट .Net कोर्स वर्कबुक से निर्देशों का पालन कर रहा हूं, अभ्यास में से एक के माध्यम से जा रहा हूं। (विशेष रूप से यह कोर्स MS2349B है और मैं मॉड्यूल 4 व्यायाम कर रहा हूं 2.)। ये अभ्यास पूर्व विस्टा दिनों के लिए बनाए जाते हैं जब हर किसी के पास हर समय पूर्ण व्यवस्थापक विशेषाधिकार होते हैं। (मैं .NET 4.0 का उपयोग कर रहा हूं।)असेंबली के लिए जांच करते समय सामान्य उपयोगकर्ता के रूप में व्यवस्थापक बनाम चलते समय सार्वजनिक केटोकन की खोज क्यों भिन्न होती है?

इस अभ्यास में एक मजबूत नाम असेंबली बनाना, इसे जीएसी में स्थापित करना, मजबूत नामित असेंबली के खिलाफ स्थानीय निष्पादन योग्य बनाना, यह सत्यापित करना कि निष्पादन योग्य रन।

#if STRONG 
[assembly: System.Reflection.AssemblyVersion("2.0.0.0")] 
[assembly: System.Reflection.AssemblyKeyFile("OrgVerKey.snk")] 
#endif 

मैं एक स्थानीय उपयोगकर्ता के रूप में अपने निष्पादन का निर्माण:

C:\path\to\lab>csc /define:STRONG /target:library 
/out:AReverser_v2.0.0.0\AReverser.dll AReverser_v2.0.0.0\AReverser.cs 
C:\path\to\lab>csc /reference:MyStringer\Stringer.dll  
/reference:AReverser_v2.0.0.0\AReverser.dll Client.cs 

मैं एक दृश्य के माध्यम से GAC में इसे स्थापित

ट्यूटोरियल के अनुसार, मैं एक #if ब्लॉक का उपयोग मेरी विधानसभा पर हस्ताक्षर स्टूडियो कमांड प्रॉम्प्ट व्यवस्थापक के रूप में चलाया जाता है:

C:\path\to\lab>gacutil /i AReverser_v2.0.0.0\AReverser.dll 

जब मैं व्यवस्थापक संकेत में अपना exe चलाता हूं I मुझे उम्मीद है कि आउटपुट प्राप्त करें - एप्लिकेशन ठीक चलाता है और जीएसी से सही ढंग से डीएलएल लोड करने लगता है। जब मैं गैर-व्यवस्थापक कमांड प्रॉम्प्ट मैं निम्नलिखित त्रुटि मिलती है के तहत चलाए जा

Unhandled Exception: System.IO.FileLoadException: Could not load file or assembl 
y 'AReverser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b5fcbdcff229fabb' 
or one of its dependencies. The located assembly's manifest definition does not 
match the assembly reference. (Exception from HRESULT: 0x80131040) 
    at MainApp.Main() 

क्या मेरे लिए अजीब है कि PublicKeyToken क्या GAC में है के रूप में ही नहीं है:

AReverser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=f0548c0027634b66 

लेकिन अगर मैं GAC से AReverser स्थापना रद्द करें और व्यवस्थापक के रूप में मेरे शीघ्र exe चलाने के लिए प्रयास मैं निम्न त्रुटि जो इसकी उम्मीद सार्वजनिक कुंजी टोकन f0548c0027634b66 की तलाश में इंगित करता है मिलती है:

C:\path\to\lab>gacutil /u "AReverser,Version=2.0.0.0,Culture=neutral, 
PublicKeyToken=f0548c0027634b66" 
Microsoft (R) .NET Global Assembly Cache Utility. Version 4.0.30319.1 
Copyright (c) Microsoft Corporation. All rights reserved. 


Assembly: AReverser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=f0548c0027 
634b66 
Uninstalled: AReverser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=f0548c0 
027634b66 
Number of assemblies uninstalled = 1 
Number of failures = 0 

C:\path\to\lab>Client.exe 

Unhandled Exception: System.IO.FileLoadException: Could not load file or assembl 
y 'AReverser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=f0548c0027634b66' 
or one of its dependencies. The located assembly's manifest definition does not 
match the assembly reference. (Exception from HRESULT: 0x80131040) 
    at MainApp.Main() 

सूचना के तहत व्यवस्थापक, यह वास्तव में सही सार्वजनिक KeyToken के लिए खोज रहा है।

क्या देता है? प्रकाशन के लिए खोज क्यों की जाएगी टोक्योन्स अलग? मैं गलत क्या कर सकता था?

संपादित

एप्लिकेशन config हम उपयोग करने के लिए अपराधी हो सकते हैं बताया, मैं अगर आप इनमें से कुछ सेटिंग लागू करने के लिए व्यवस्थापक होना है सोच रहा हूँ। ऐसा लगता है कि इससे छुटकारा पाने के लिए व्यवस्थापक विफल होने का कारण बनता है (हालांकि उस मामले में publicKeyToken को NULL के रूप में सूचीबद्ध किया गया है)। यहां मेरा ऐप कॉन्फ़िगरेशन

<configuration> 
    <runtime> 
     <assemblyBinding 
      xmlns="urn:schemas-microsoft-com:asm.v1"> 
      <probing privatePath="MyStringer"/> 
      <publisherPolicy apply="no"/> 
      <dependentAssembly> 
       <assemblyIdentity name="AReverser" 
        publicKeyToken="f0548c0027634b66" 
        culture=""/> 
       <publisherPolicy apply="no"/> 
       <bindingRedirect oldVersion="2.0.0.0" 
        newVersion="2.0.0.0"/> 
      </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 
+0

क्या आपने असेंबली पर हस्ताक्षर किए थे? मुझे आपके सीएससी कथन में एक महत्वपूर्ण फाइल नहीं दिखाई दे रही है। – user957902

+0

@ user957902 मैं उन पर '#if STRONG' ब्लॉक के साथ साइन इन करता हूं क्योंकि MS2349B कार्यपुस्तिका में उदाहरण मुझे –

+1

पर बताते हैं। .snk फ़ाइल कहां से आई थी? यदि आपने अपना स्वयं का बना दिया है तो आपको कॉन्फ़िगरेशन फ़ाइल में टोकन मान बदलना होगा। इस अभ्यास करने से पहले –

उत्तर

1

AReverser.dll के लिए अपनी डिस्क खोजें। यह संभव है कि आपके पास कहीं भी कुछ अतिरिक्त प्रतियां छिपी हों। वीएस संकलित डीएलएस की छाया प्रतियां बना सकता है।

यदि यह संलयन लॉगिंग सक्रिय करने में मदद नहीं करता है (डिस्क पर fuslogvw.exe या स्पूल फ़्यूज़न लॉग का उपयोग करें) और फिर उन लॉग में देखें जहां समस्याग्रस्त डीएल लोड किया गया है। आईएमओ यह गलत डीएल है जो लोड किया गया है।

0

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

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