2010-04-30 14 views
12

में मित्र असेंबली मैं [InternalsVisibleTo()] विशेषता का उपयोग करके कुछ 'मित्र असेंबली' बनाने की कोशिश कर रहा हूं, लेकिन मुझे यह काम नहीं मिल रहा है। मैंने creating signed friend assemblies के लिए माइक्रोसॉफ्ट के निर्देशों का पालन किया है और मैं नहीं देख सकता कि मैं कहां गलत हो रहा हूं। तो मैं यहां अपने कदमों का विस्तार करूंगा और उम्मीद करता हूं कि कोई मेरी जानबूझ कर गलती को खोज सके ...?सी #

सार्वजनिक कुंजी एक मजबूत नाम कुंजी बनाएँ और निकालने, इस प्रकार:

एस.एन. -k StrongNameKey
एस.एन. -p public.pk
एस.एन. -tp public.pk

जोड़ें प्रत्येक प्रोजेक्ट के लिए मजबूत नाम कुंजी और हस्ताक्षर सक्षम करें।

एक आंतरिक संपत्ति के साथ एक परियोजना Internals कहा जाता है और एक कक्षा बनाएं:

namespace Internals 
{ 
    internal class ClassWithInternals 
    { 
     internal string Message { get; set; } 
     public ClassWithInternals(string m) 
     { 
      Message = m; 
     } 
    } 
} 

TestInternalsVisibleTo नामक एक अन्य परियोजना बनाएँ:

namespace TestInternalsVisibleTo 
{ 
    using Internals; 

    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      var c = new Internals.ClassWithInternals("Test"); 
      Console.WriteLine(c.Message); 
     } 
    } 
} 

संपादित Internals परियोजना के लिए AssemblyInfo.cs फ़ाइल, और teh आवश्यक विशेषता जोड़ें:

[assembly: AssemblyTitle("AssemblyWithInternals")] 
[assembly: AssemblyDescription("")] 
[assembly: AssemblyConfiguration("")] 
[assembly: AssemblyCompany("Microsoft")] 
[assembly: AssemblyProduct("Internals")] 
[assembly: AssemblyCopyright("Copyright © Microsoft 2010")] 
[assembly: AssemblyTrademark("")] 
[assembly: AssemblyCulture("")] 
[assembly: ComVisible(false)] 
[assembly: Guid("41c590dc-f555-48bc-8a94-10c0e7adfd9b")] 

[assembly: AssemblyVersion("1.0.0.0")] 
[assembly: AssemblyFileVersion("1.0.0.0")] 

[assembly: InternalsVisibleTo("TestInternalsVisibleTo PublicKey=002400000480000094000000060200000024000052534131000400000100010087953126637ab27cb375fa917c35b23502c2994bb860cc2582d39912b73740d6b56912c169e4a702bedb471a859a33acbc8b79e1f103667e5075ad17dffda58988ceaf764613bd56fc8f909f43a1b177172bc4143c96cf987274873626abb650550977dcad1bb9bfa255056bb8d0a2ec5d35d6f8cb0a6065ec0639550c2334b9")] 

और अंत में ... निर्माण! इसके संरक्षण के स्तर
त्रुटि CS1729 की वजह से 'Internals.ClassWithInternals' दुर्गम है:

त्रुटि CS0122:

मैं निम्नलिखित त्रुटियाँ प्राप्त 'Internals.ClassWithInternals' एक निर्माता है कि 1 तर्क लेता है शामिल नहीं है त्रुटि CS1061: 'Internals.ClassWithInternals' में 'संदेश' की परिभाषा नहीं है और 'Internals.ClassWithInternals' प्रकार के पहले तर्क को स्वीकार करने वाला कोई एक्सटेंशन विधि नहीं मिला है (क्या आप एक निर्देश या एक असेंबली संदर्भ का उपयोग कर रहे हैं ?)

असल में, ऐसा लगता है कि मैंने InternalsVisibleTo attrbute का उपयोग नहीं किया था। अब, मैं उपकरण को दोष देने के जाल में नहीं जा रहा हूं, तो यहाँ क्या हो रहा है? किसी को?

+1

क्या आप निश्चित हैं कि TestInternalsVisibleTo पर हस्ताक्षर हो रहा है? जब आप इसे प्रतिबिंबक में देखते हैं, तो क्या आप इसे सार्वजनिक कुंजी टोकन देखते हैं? –

उत्तर

15

आप InternalsVisibleTo विशेषता में असेंबली नाम के बाद कॉमा खो रहे हैं।

यह होना चाहिए:

[assembly: InternalsVisibleTo("TestInternalsVisibleTo, PublicKey=....]; 

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

+0

आपने इसे नाखुश किया, धन्यवाद! मैं आपको नहीं बता सकता कि मैंने कितनी बार उस स्ट्रिंग की जांच की! :) मुझे पता था कि यह कुछ आसान होगा। –