2013-02-12 13 views
16

में एक्सई एप्लिकेशन नाम और संस्करण कैसे प्राप्त करें मेरे एप्लिकेशन में एक एक्सई है और कुछ डीएलएल का उपयोग करता है। मैं सभी सी # में लिख रहा हूँ।सी # कॉम्पैक्ट फ्रेमवर्क

एक डीएलएल में मैं exe में संस्करण जानकारी से एप्लिकेशन नाम और संस्करण प्राप्त करने के लिए एक विधि लिखना चाहता हूं।

मैं समझता हूं कि पूर्ण .NET में मैं GetEntryAssembly का उपयोग कर सकता हूं, लेकिन यह सीएफ में अनुपलब्ध है।

+0

क्या आपने 'System.Diagnostics.Process.GetCurrentProcess()। MainModule.ModuleName' को आजमाया था? यही था कि ** मैं ** आपके प्रश्न पर ठोकर खा रहा था। – Bitterblue

+0

@ मिनी-मुझे – cja

उत्तर

43

एप्लिकेशन के नाम हो रही है की तरह Win32 एपीआई की कोशिश कर सकते हैं:

System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; 

आप चाहते हो सकता है: संस्करण हो रही

System.Reflection.Assembly.GetExecutingAssembly().GetName().Name; 

GetCallingAssembly() या टाइप करके असेंबली प्राप्त करना (उदाहरण के लिए typeof(Program).Assembly) यदि आपका डीएलएल EXE संस्करण प्राप्त करने का प्रयास कर रहा है और आपके पास तत्काल पहुंच नहीं है।

संपादित

आप एक DLL है और आप निष्पादन के नाम की जरूरत है आप कुछ ही विकल्प हैं, उपयोग के मामले के आधार पर है। आप एएनई असेंबली में निहित एक प्रकार से असेंबली प्राप्त कर सकते हैं, लेकिन चूंकि डीएलएल के लिए EXE का संदर्भ देना दुर्लभ होगा, इसलिए उस प्रकार के ऑब्जेक्ट में EXE पास की आवश्यकता होती है।

Version GetAssemblyVersionFromObjectType(object o) 
{ 
    o.GetType().Assembly.GetName().Version; 
} 

तुम भी का एक छोटा सा कर सकता है एक अंत चलाने इस तरह:

[DllImport("coredll.dll", SetLastError = true)] 
private static extern int GetModuleFileName(IntPtr hModule, StringBuilder lpFilename, int nSize); 

... 

var name = new StringBuilder(1024); 
GetModuleFileName(IntPtr.Zero, name, 1024); 
var version = Assembly.LoadFrom(name.ToString()).GetName().Version; 
+0

क्या आप निश्चित हैं, यह कॉम्पैक्ट फ्रेमवर्क में काम करेगा? –

+0

GetExecutingAssembly() को डीएलएल का नाम मिलेगा जिसे इसे कहा जाता है। मुझे exe का नाम चाहिए। – cja

+0

GetCallingAssembly() अधिक जटिल है और अप्रत्याशित परिणाम हो सकते हैं। – cja

-2

क्या आप FileInfo कक्षा FileVersionInfo का उपयोग करने का प्रयास कर सकते हैं। उम्मीद है कि यह मदद मिलेगी ..

तुम भी GetModuleFile()

+1

याद रखने में बहुत समय पहले कृपया उदाहरण कोड – cja

+0

नमूने के लिए msdn जांचें। –

+5

हम में से एक यह नहीं समझता कि कैसे StackOverflow – cja

2

आप एक घटक (.dll) बनाने को अन्य एप्लिकेशन के संदर्भ में उपयोग करने के मुख्य लाने के लिए करना चाहते हैं

मुख्य एप्लिकेशन के नाम हो रही है: संस्करण हो रही

AppDomain.CurrentDomain.DomainManager.EntryAssembly.GetName().Name; 

एप्लिकेशन नाम और संस्करण है, तो आप इस तरह से उपयोग कर सकते हैं:

AppDomain.CurrentDomain.DomainManager.EntryAssembly.GetName().Version.ToString();  

FullName हो रही है (होते हैं: ऐप्लिकेशन का नाम, एप्लिकेशन संस्करण, संस्कृति, PublicKeyToken):

AppDomain.CurrentDomain.DomainManager.EntryAssembly.FullName; 

लेकिन इस समाधान में कोई समस्या है, यह है कि, मेजबान पर और अगर निर्भर है यह निष्पादन योग्य फ़ाइल से सीधे चलाता है, त्रुटि उत्पन्न होगी। इसलिए निम्नलिखित चुनाव: संस्करण हो रही

string appName = AppDomain.CurrentDomain.FriendlyName; 
appName = appName.Substring(0, appName.IndexOf('.')); 

:

मुख्य एप्लिकेशन के नाम हो रही

System.Windows.Forms.Application.ProductVersion; 
14

System.Reflection.Assembly.GetEntryAssembly().GetName().Version;

इस समारोह में जहां अन्य पुस्तकालयों से आवेदन के संस्करण दे देंगे लोड हो गए हैं

System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;

यह वर्तमान पुस्तकालय के संस्करण दे देंगे। यदि आप इसे एप्लिकेशन लाइब्रेरी में कॉल करते हैं तो आपको एप्लिकेशन संस्करण मिलेगा और यदि इसे डीएलएल में कॉल किया जाए तो उसे डीएलएल संस्करण मिलेगा।

तो मेरी राय में System.Reflection.Assembly.GetEntryAssembly().GetName().Version; उपयोग करने के लिए सही कार्य है।

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