2008-12-17 16 views
66

प्राप्त करना मैं अपने सी # एप्लिकेशन के अंदर .NET Framework निर्देशिका पथ कैसे प्राप्त कर सकता हूं?.NET Framework निर्देशिका पथ

फ़ोल्डर है कि मैं उल्लेख है "C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727"

उत्तर

171

का उपयोग मार्ग का अनुसरण विधि का उपयोग कर प्राप्त किया जा सकता है :

System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory() 

मैं करूंगा सीधे रजिस्ट्री पढ़ने के खिलाफ दृढ़ता से सलाह। उदाहरण के लिए, जब 64 बिट सिस्टम में एक .NET अनुप्रयोग चल रहा है, तो सीएलआर या तो "सी: \ विंडोज \ माइक्रोसॉफ्ट.NET \ Framework64 \ v2.0.50727" (AnyCPU, x64 संकलन लक्ष्य) से लोड किया जा सकता है या "सी: \ विंडोज़ \ माइक्रोसॉफ्ट.NET \ Framework \ v2.0.50727 "(x86 संकलन लक्ष्य)। रजिस्ट्री पढ़ना नहीं आपको बताएगा कि वर्तमान सीएलआर द्वारा दो निर्देशिकाओं में से कौन सी निर्देशिका का उपयोग किया गया था।

एक और महत्वपूर्ण तथ्य यह है कि "वर्तमान सीएलआर" .NET 2.0, .NET 3.0 और .NET 3.5 अनुप्रयोगों के लिए "2.0" होगा। इसका मतलब है कि GetRuntimeDirectory() कॉल .NET 3.5 अनुप्रयोगों के भीतर भी 2.0 निर्देशिका लौटाएगी (जो 3.5 निर्देशिका से उनकी कुछ असेंबली लोड करती है)। ".NET Framework निर्देशिका पथ" शब्द की आपकी व्याख्या के आधार पर, GetRuntimeDirectory वह जानकारी नहीं हो सकती है जिसे आप ढूंढ रहे हैं ("सीएलआर निर्देशिका" बनाम "निर्देशिका जिसमें से 3.5 असेंबली आ रही हैं")।

+2

मेरा मानना ​​है कि यह सही उत्तर है और इसे चुना जाना चाहिए। इस तथ्य को स्पष्ट करने के लिए धन्यवाद कि GetRuntimeDirectory हमेशा 3.0 या 3.5 ऐप्स पर भी 2.0 फ़ोल्डर देता है। अधिकांश मामलों में यह सही व्यवहार है, जहां आप फ्रेमवर्क टूल तक पहुंचना चाहते हैं, जो 2.0 में हैं (लेकिन 3.0 3.5 में नहीं)। – DSO

+0

मैं 6486 सिस्टम पर x86 और x64 .NET फ्रेमवर्क के लिए InstallRoot कैसे प्राप्त कर सकता हूं? क्या "[HKLM] \ Software \ Microsoft.NetFramework \ InstallRoot" हमेशा .NET के x86 संस्करण को इंगित करता है, यहां तक ​​कि 64 बिट सिस्टम पर भी? मुझे इस फ़ोल्डर में गैर-प्रबंधित एप्लिकेशन के साथ पथ प्राप्त करने की आवश्यकता है, इसलिए मैं ऊपर सूचीबद्ध विधि का उपयोग नहीं कर सकता। धन्यवाद। – Paya

+1

संभवतः सबसे आसान छोटा .NET अनुप्रयोग बनाना होगा, जिसे x86 (उदा। 'Getdotnetpath32.exe') के लिए संकलित किया गया है और दूसरा x64 (उदा। 'Getdotnetpath64.exe') के लिए संकलित किया गया है। प्रबंधित एप्लिकेशन GetRuntimeDirectory() कॉल का उपयोग करेगा और इसे STDOUT (Console.Output) पर लिख देगा।अप्रबंधित एप्लिकेशन तब x86 (getdotnetpath32.exe) के लिए एक बाल प्रक्रिया शुरू करेगा, जो इसके एसटीडीओयूटी को अपनी इन-मेमोरी स्ट्रीम से जोड़ता है और प्रक्रिया को उत्पन्न करता है। फिर यह x64 (getdotnetpath64.exe) के लिए एक बाल प्रक्रिया शुरू करेगा, जो इसके एसटीडीओयूटी को अपनी इन-मेमोरी स्ट्रीम से जोड़ता है और यह पढ़ता है कि प्रक्रिया –

2

आप Windows रजिस्ट्री से यह हड़पने कर सकते हैं:

using System; 
using Microsoft.Win32; 

// .. ।

public static string GetFrameworkDirectory() 
{ 
    // This is the location of the .Net Framework Registry Key 
    string framworkRegPath = @"Software\Microsoft\.NetFramework"; 

    // Get a non-writable key from the registry 
    RegistryKey netFramework = Registry.LocalMachine.OpenSubKey(framworkRegPath, false); 

    // Retrieve the install root path for the framework 
    string installRoot = netFramework.GetValue("InstallRoot").ToString(); 

    // Retrieve the version of the framework executing this program 
    string version = string.Format(@"v{0}.{1}.{2}\", 
    Environment.Version.Major, 
    Environment.Version.Minor, 
    Environment.Version.Build); 

    // Return the path of the framework 
    return System.IO.Path.Combine(installRoot, version);  
} 

Source

+11

मैं सीधे रजिस्ट्री तक पहुंचने के खिलाफ दृढ़ता से सलाह देता हूं (64 बिट ऑपरेटिंग सिस्टम पर यह वास्तव में गलत जवाब दे सकता है)। विवरण के लिए नीचे मेरा जवाब देखें। –

+1

@ मिलन के साथ सहमत - निश्चित रूप से अनुशंसित नहीं है। –

+0

@ सीएमएस मैं silvetlight संस्करण की तरह ही करना चाहता हूँ। और यदि मैं रजिस्ट्री कुंजी को हटा रहा हूं जिसका अर्थ है कि सॉफ़्टवेयर सिस्टम से भी अनइंस्टॉल करता है। धन्यवाद –

-3
[HKLM] \ softw की

पढ़ें मूल्य \ Microsoft.NetFramework \ InstallRoot कुंजी हैं - आपको "सी: \ विन्डोज़ \ Microsoft.NET \ Framework" मिलेगा। फिर वांछित ढांचे संस्करण के साथ संलग्न करें।

39

एक आसान तरीका Microsoft.Build.Utilities विधानसभा में शामिल हैं और CLR वर्तमान .NET अनुप्रयोग के लिए सक्रिय की स्थापना निर्देशिका के लिए

using Microsoft.Build.Utilities; 
ToolLocationHelper.GetPathToDotNetFramework(
     TargetDotNetFrameworkVersion.VersionLatest); 
+0

यह बहुत बेहतर लगता है, खासकर जब निर्माण प्रक्रिया को प्रभावित करने वाले उपकरणों पर काम करते हैं। –