मित्र विधानसभा की घोषणा कैसे करें?


114

मेरे हल में 2 परियोजनाएँ हैं:

  1. असेंबली (बेसिक लाइब्रेरी)
  2. टेस्ट असेंबली (NUnit)

मैंने पहले प्रोजेक्ट में टेस्ट असेंबली को मित्र विधानसभा घोषित किया था:

[assembly: InternalsVisibleTo ("Company.Product.Tests")]

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

मित्र विधानसभा संदर्भ 'Company.Product.Tests' अमान्य है। मजबूत नाम वाले हस्ताक्षरित असेंबली को अपने इंटरनैशनलविजिटो घोषणाओं में एक सार्वजनिक कुंजी निर्दिष्ट करनी चाहिए।

मैंने स्नेक यूटिलिटी का उपयोग करते हुए अपनी स्नेक फाइल से सार्वजनिक कुंजी निकालने की कोशिश की, लेकिन यह एक वायर्ड बाइनरी फाइल उत्पन्न करता है जिसका उपयोग करने के लिए मैं अनिश्चित हूं। मैं समस्या को कैसे ठीक कर सकता हूं?

जवाबों:


194

आपको दोनों विधानसभाओं पर हस्ताक्षर करने की आवश्यकता है , क्योंकि प्रभावी रूप से दोनों विधानसभाएं एक दूसरे का संदर्भ देती हैं।

आपको सार्वजनिक कुंजी को InternalsVanishTo विशेषता में रखना होगा। उदाहरण के लिए, प्रोटोकॉल बफ़र्स में मैं उपयोग करता हूं:

[assembly:InternalsVisibleTo("Google.ProtocolBuffers.Test,PublicKey="+
"00240000048000009400000006020000002400005253413100040000010001008179f2dd31a648"+
"2a2359dbe33e53701167a888e7c369a9ae3210b64f93861d8a7d286447e58bc167e3d99483beda"+
"72f738140072bb69990bc4f98a21365de2c105e848974a3d210e938b0a56103c0662901efd6b78"+
"0ee6dbe977923d46a8fda18fb25c65dd73b149a5cd9f3100668b56649932dadd8cf5be52eb1dce"+
"ad5cedbf")]

सार्वजनिक कुंजी को चलाकर पुनर्प्राप्त किया जाता है

sn -Tp path\to\test\assembly.dll

वैकल्पिक रूप से, इसे .snk फ़ाइल से प्राप्त करें:

sn -p MyStrongnameKey.snk public.pk
sn -tp public.pk

7
और यह MSDN प्रलेखन ( msdn.microsoft.com/en-us/library/… ) को देखने के लिए परेशान है, हास्यास्पद रूप से छोटी सार्वजनिक कुंजी का उल्लेख करते हैं जो लगभग सार्वजनिक कुंजी टोकन की तरह दिखती हैं ।
हेमंत

3
आप सार्वजनिक कुंजी को सीधे .snk फ़ाइल से निकाल सकते हैं: sn -k MyStrongnameKey.snk // sn -p MyStrongnameKey.snk public.pk // sn -tp public.pn //
टिम लॉन्ग

1
मैं निर्दिष्ट 'असेंबली टाइटल' का उपयोग कर रहा था AssemblyInfo.cs। तब से उपयोग करने के लिए सही नाम घटाया परियोजना के गुण / अनुप्रयोग संवाद से 'असेंबली का नाम' है (जो दृश्य स्टूडियो समाधान एक्सप्लोरर में परियोजना के नाम से अलग है)।
कर्नल पैनिक ने

7
इन उत्तरों और टिप्पणियों के रूप में सहायक होने के नाते, मुझे यह महसूस करने के लिए कुछ प्रयोग की आवश्यकता थी कि सार्वजनिक कुंजी विधानसभा से एक है जिसमें परीक्षण शामिल हैं, न कि विधानसभा जिसमें als इंटरनल्स इनविजिबलटेओ ’घोषणा शामिल है।
एंड्रियास


-3

आप सीधे विधानसभा से publicKey प्राप्त कर सकते हैं, जिसे आप रुचि रखते हैं, sn.exe के साथ जादू के बिना

<!-- language: c# -->
var assemblyName = Assembly.GetExecutingAssembly().GetName();
Console.WriteLine("{0}, PublicKey={1}",
    assemblyName.Name,
string.Join("", assemblyName.GetPublicKey().Select(m => string.Format("{0:x2}", m))));

1
यह इस सवाल का जवाब नहीं है । यह उस जवाब
कोल जॉनसन

-7

मुझे लगता है कि आपको मजबूत नाम रखने की जरूरत है, जो कुछ इस तरह होगा "Company.Product.Tests, संस्करण = 1.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = 17135d9fcba0119f"। मुझे लगता है कि Company.Product.Tests आपके विधानसभा का नाम है और 17135d9fcba0119f सार्वजनिक कुंजी है।

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


मुझे नहीं लगता कि हमें संस्करण संख्या और संस्कृति ( msdn.microsoft.com/en-us/library/… देखें ) निर्दिष्ट करने की आवश्यकता है । मैंने वास्तव में विधानसभा में ही टेस्ट कोड डालने की कोशिश की। कोशिश करेंगे और देखेंगे कि यह कैसे काम करता है (टिप के लिए +1)।
हेमंत

4
इंटरनैशनलविज़नटो के लिए, PublicKeToken पर्याप्त नहीं है। आपको संपूर्ण सार्वजनिक कुंजी की आवश्यकता है :-(
सीन रेली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.