2008-09-09 10 views
15

का हिस्सा है, मैं असेंबली नाम, या असेंबली क्लास (या अन्य जैसे) से कैसे कह सकता हूं, चाहे कोई असेंबली .NET ढांचे का हिस्सा है (यानी System.windows.Forms)?यह निर्धारित करना कि कोई असेंबली .NET Framework

अब तक मैंने पब्लिककेट टोकन और कोडबेस गुणों पर विचार किया है, लेकिन ये पूरे ढांचे के लिए हमेशा समान नहीं हैं।

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

परम समाधान होगा एक IsFramework संपत्ति है कि वहाँ ... :)

+0

यह कितना स्वचालित होना चाहिए? एमएस से कौन से हैं यह चुनना बहुत आसान है। – RQDQ

उत्तर

3

मुझे लगता है कि विधि दोनों सबसे विश्वसनीय और सबसे सामान्य PublicKeyToken होने जा रहा है। हां, एक से अधिक है, लेकिन यह एक सीमित सूची होगी और वह जो अक्सर नहीं बदलता है।

उस मामले के लिए, आप केवल असेंबली नामों की श्वेतसूची प्राप्त कर सकते हैं - यह सूची भी ढांचे के संस्करणों के बीच सीमित और स्थैतिक दोनों होगी।

+0

मुझे आश्चर्य है कि क्या आप सार्वजनिक कुंजी टोकन के लिए कुछ Microsoft सेवा से पूछ सकते हैं ... जिस तरह से वे रिमोट प्रतीक सर्वर प्रदान करते हैं। इस तरह आपको इसे मैन्युअल रूप से ट्रैक करने की आवश्यकता नहीं है। –

1

आप असेंबली के प्रकाशक को देखने के लिए प्रतिबिंब का उपयोग कर सकते हैं, और असेंबली के पथ के साथ समन्वय कर सकते हैं। अगर आपको एक असेंबली मिलती है जिसका प्रकाशक माइक्रोसॉफ्ट है, और जो C:\Windows\Microsoft.NET\Framework से कहीं नीचे मौजूद है, तो यह एक सुरक्षित शर्त है जो रनटाइम का हिस्सा है।

दूसरे विचार पर, प्रकाशक भी आवश्यक नहीं हो सकता है। उस पथ के नीचे कुछ भी रनटाइम का हिस्सा होना चाहिए (एक दुर्व्यवहार करने वाले एप्लिकेशन को छोड़कर जहां यह नहीं होना चाहिए)।

+0

यहां मुद्दा यह है कि असेंबलीनाम और असेंबली –

3

नहीं, यह "सिस्टम" से शुरू नहीं होता है। आप "विंडोजबेस" की जांच कर सकते हैं जो एक ढांचा असेंबली है।

आप पब्लिककेट टोकन भी नहीं देख सकते हैं, क्योंकि "माइक्रोसॉफ्ट असेंबली" डिफ़ॉल्ट "कुंजी" के साथ हस्ताक्षरित हैं, लेकिन वे .NET Framework (विजुअल स्टूडियो असेंबली) का हिस्सा नहीं हैं।

ऐसा करने का सबसे अच्छा तरीका स्थापित .NET ढांचे का संग्रह प्राप्त करना है और जांचें कि लक्षित असेंबली उनके RedistList (RedistList\FrameworkList.xml) का हिस्सा है या नहीं।

FrameworkList.xml में पाया जा सकता:

  • .NET 2.0: C: \ RedistList \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727
  • नेट 3.x: C: \ प्रोग्राम फ़ाइलें (x86) \ संदर्भ विधानसभाओं \ Microsoft \ फ्रेमवर्क \ v VersionNumber \ RedistList
  • नेट 4.x: C: \ प्रोग्राम फ़ाइलें (x86) \ संदर्भ विधानसभाओं \ Microsoft \ Framework.NETFramework \ v VersionNumber \ RedistList
  • नेट कोर: C: \ प्रोग्राम फ़ाइलें (x86) \ संदर्भ विधानसभाओं \ Microsoft \ Framework.NETCore \ वी VersionNumber \ RedistList
+0

के अनुसार जीएसी में बहुत सी चीजें +1 से अधिक की आवश्यकता है। यह वास्तविक, आधिकारिक उत्तर है। –

1

आप जानते हैं कि आपके DLLs में से कोई भी GAC में आप की जांच कर सकता हो जाएगा क्या प्रत्येक असेंबली जीएसी में है या नहीं। यदि ऐसा है, तो इसे कॉपी न करें। यदि यह नहीं है, तो इसे कॉपी करें।GlobalAssemblyCache नामक विधानसभा वर्ग पर एक संपत्ति है। यह स्पष्ट रूप से दूसरों की तुलना में कुछ परिस्थितियों में बेहतर काम करेगा।

3

इसे पूरा करने के लिए मैं असेंबली प्रोडक्ट एट्रिब्यूट के माध्यम से असेंबली के भीतर एम्बेडेड उत्पाद नाम का उपयोग कर रहा हूं।

var attribute = assembly.GetCustomAttributes(typeof(AssemblyProductAttribute), false)[0] as AssemblyProductAttribute; 
var isFrameworkAssembly = (attribute.Product == "Microsoft® .NET Framework"); 

मैं उत्पाद द्वारा समूह विधानसभाओं के लिए इस तकनीक का उपयोग कर रहा आवेदन के बारे में स्क्रीन के नीचे और यह मेरे लिए ठीक काम करने के लिए लगता है।

4

मुझे एक ही मुद्दे से निपटना पड़ा है। दुर्भाग्यवश, अब तक दिए गए सभी उत्तरों अपर्याप्त सुरक्षित रूप से यह निर्धारित करने के लिए हैं कि कोई असेंबली .NET Framework का हिस्सा है या नहीं।

माइक्रोसॉफ्ट एक स्थिरांक स्ट्रिंग संस्करण का संकेत के साथ एक कक्षा प्रत्येक ढांचे विधानसभा के ग्लोबल नेम स्पेस में FXAssembly नामित कहते हैं: अगर एक विधानसभा एक रूपरेखा विधानसभा है

.class private abstract auto ansi sealed beforefieldinit FXAssembly 
    extends [mscorlib]System.Object 
{ 
    .field assembly static literal string Version = string('2.0.0.0') 

} 

उपयोग इस "मार्कर" जाँच करने के लिए। सार्वजनिक कुंजी की जांच करना भी चोट नहीं पहुंचाएगा।

+1

दुर्भाग्य से, यह सभी फ्रेमवर्क असेंबली के लिए सच नहीं है :(उदाहरण: सिस्टम। डेटा संस्करण 2.0.0.0 में उस वर्ग नहीं है, भले ही यह .NET Framework 2.0 का हिस्सा था। अभी भी 'b77a5c561934e089' के सार्वजनिक कुंजी टोकन की जांच कर रहा है प्रतीत होता है कि –

+1

'b77a5c561934e089' के अलावा कम से कम 3 और हैं:' 31bf3856ad364e35' (उदाहरण के लिए प्रेजेंटेशनकोर डीएल), 'b03f5f7f11d50a3a' (जैसे System.Drawing.dll) और' 89845dcd8080cc91' (उदाहरण के लिए System.Data.SqlServerCe .dll) – VitalyB

1

जब आप दृश्य स्टूडियो स्थापित करते हैं, आप प्रपत्र C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\{FrameworkName}\{FrameworkVersion} के विभिन्न सब-फ़ोल्डर के संदर्भ विधानसभाओं मिल - सबसे दिलचस्प बात RedistList\FrameworkList.xml फ़ाइल है कि सभी विधानसभा ऐसे नाम हैं जो दिया ढांचा संस्करण के साथ भेज दिया गया की एक सूची है हो सकता है।

उदा। C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\RedistList\FrameworkList.xml में सभी .NET 4.0 की फ्रेमवर्क असेंबली की एक सूची शामिल है।

आप इन फ़ाइलों का आसानी से असेंबली की स्थिर सफेद सूचियों को स्थापित करने के लिए उपयोग कर सकते हैं।

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