मैं एक 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>
क्या आपने असेंबली पर हस्ताक्षर किए थे? मुझे आपके सीएससी कथन में एक महत्वपूर्ण फाइल नहीं दिखाई दे रही है। – user957902
@ user957902 मैं उन पर '#if STRONG' ब्लॉक के साथ साइन इन करता हूं क्योंकि MS2349B कार्यपुस्तिका में उदाहरण मुझे –
पर बताते हैं। .snk फ़ाइल कहां से आई थी? यदि आपने अपना स्वयं का बना दिया है तो आपको कॉन्फ़िगरेशन फ़ाइल में टोकन मान बदलना होगा। इस अभ्यास करने से पहले –