क्या किसी .NET .NET DLL से प्रोग्राम क्रमांक प्राप्त करना संभव है?
यदि हाँ, तो कैसे?
क्या किसी .NET .NET DLL से प्रोग्राम क्रमांक प्राप्त करना संभव है?
यदि हाँ, तो कैसे?
जवाबों:
Assembly assembly = Assembly.LoadFrom("MyAssembly.dll");
Version ver = assembly.GetName().Version;
महत्वपूर्ण: यह ध्यान दिया जाना चाहिए कि यह मूल प्रश्न का सबसे अच्छा जवाब नहीं है। इस पृष्ठ पर और अधिक पढ़ने के लिए मत भूलना।
Assemblyname.GetAssemblyNameइन मुद्दों से बचने की सलाह देता हूँ
beforefieldinitटाइप इनिशियलाइज़र को निष्पादित करना, और इस मामले में बस आवश्यक नहीं है। क्या ये कारण पर्याप्त हैं?
FileVersionInfo.GetVersionInfo("foo.dll").FileVersionअच्छी तरह से काम करता है और आवेदन में dll लोड नहीं करता है।
यह काम करता है अगर dll .net या Win32 है । प्रतिबिंब विधियाँ केवल तभी काम करती हैं जब dll .net हो। इसके अलावा, यदि आप प्रतिबिंब का उपयोग करते हैं, तो आपके पास पूरे डीएल को मेमोरी में लोड करने का ओवरहेड है। नीचे की विधि विधानसभा को मेमोरी में लोड नहीं करती है।
// Get the file version.
FileVersionInfo myFileVersionInfo = FileVersionInfo.GetVersionInfo(@"C:\MyAssembly.dll");
// Print the file name and version number.
Console.WriteLine("File: " + myFileVersionInfo.FileDescription + '\n' +
"Version number: " + myFileVersionInfo.FileVersion);
प्रेषक: http://msdn.microsoft.com/en-us/library/system.diagnostics.fileversioninfo.fileversion.aspx
@"C:\MyAssembly.dll"ऊपर), आप उपयोग कर सकते हैं System.Reflection.Assembly.GetExecutingAssembly().Location(या एक dll यदि: Assembly.GetAssembly(typeof(AClassInTheDll)).Location)
सबसे पहले, दो संभावित 'संस्करण' हैं जिन्हें आप में रुचि हो सकती है:
विंडोज फाइलसिस्टम फ़ाइल संस्करण, सभी निष्पादन योग्य फाइलों पर लागू होता है
असेंबली बिल्ड संस्करण, जो कंपाइलर द्वारा एक .NET असेंबली में एम्बेडेड है (जाहिर है कि केवल .NET असेंबली dll और exe फ़ाइलों पर लागू होता है)
पूर्व मामले में, आपको बेन एंडरसन के उत्तर का उपयोग करना चाहिए; यदि AssemblyName.GetAssemblyName(@"c:\path\to\file.dll").Versionआपके कोड द्वारा असेंबली को संदर्भित किया जाता है , तो बाद वाले मामले में, Tataro का जवाब , उपयोग या Tataro का जवाब।
ध्यान दें कि आप उन सभी उत्तरों को अनदेखा कर सकते हैं जो उपयोग .Load()/ .LoadFrom()तरीके करते हैं, क्योंकि ये वास्तव में असेंबली को वर्तमान AppDomain में लोड करते हैं - जो एक पेड़ को काटने के लिए अनुरूप है यह देखने के लिए कि यह कितना पुराना है।
यहाँ एक विशेष वर्ग वाले DLL का एक संस्करण प्राप्त करने के लिए थोड़ा सा प्रतिबिंब का उपयोग करने का एक अच्छा तरीका है:
var ver = System.Reflection.Assembly.GetAssembly(typeof(!Class!)).GetName().Version;
बस की जगह! कक्षा! उस वर्ग के नाम के साथ जिसे आप DLL में परिभाषित करते हैं, जिसका आप संस्करण प्राप्त करना चाहते हैं।
यह मेरी पसंदीदा विधि है क्योंकि अगर मैं अलग-अलग डिप्लॉय के लिए डीएलएल को इधर-उधर कर देता हूं तो मुझे फाइलपथ को बदलने की जरूरत नहीं है।
FileVersionInfo
इसे विधानसभा के लिए शुरू करने के लिए (विनफॉर्म, कंसोल ऐप, आदि ...)
using System.Reflection;
...
Assembly.GetEntryAssembly().GetName().Version
क्राइस, वास्तविक DLL फ़ाइल से असेंबली को लोड करने की आवश्यकता होने पर आपका संस्करण बहुत अच्छा काम करता है (और अगर DLL है तो!), हालाँकि, यदि DLL EMBEDDED है तो एक बहुत अवांछित त्रुटि प्राप्त होगी (अर्थात, एक फ़ाइल नहीं, बल्कि एक एम्बेडेड। DLL)।
दूसरी बात यह है, अगर कोई " 1.2012.0508.0101 " जैसी किसी चीज के साथ संस्करण योजना का उपयोग करता है , जब कोई संस्करण स्ट्रिंग प्राप्त करता है तो आपको वास्तव में " 1.2012.518.101 " मिलेगा ; लापता शून्य पर ध्यान दें ।
इसलिए, यहां DLL का संस्करण प्राप्त करने के लिए कुछ अतिरिक्त कार्य हैं (एम्बेडेड या DLL फ़ाइल से):
public static System.Reflection.Assembly GetAssembly(string pAssemblyName)
{
System.Reflection.Assembly tMyAssembly = null;
if (string.IsNullOrEmpty(pAssemblyName)) { return tMyAssembly; }
tMyAssembly = GetAssemblyEmbedded(pAssemblyName);
if (tMyAssembly == null) { GetAssemblyDLL(pAssemblyName); }
return tMyAssembly;
}//System.Reflection.Assembly GetAssemblyEmbedded(string pAssemblyDisplayName)
public static System.Reflection.Assembly GetAssemblyEmbedded(string pAssemblyDisplayName)
{
System.Reflection.Assembly tMyAssembly = null;
if(string.IsNullOrEmpty(pAssemblyDisplayName)) { return tMyAssembly; }
try //try #a
{
tMyAssembly = System.Reflection.Assembly.Load(pAssemblyDisplayName);
}// try #a
catch (Exception ex)
{
string m = ex.Message;
}// try #a
return tMyAssembly;
}//System.Reflection.Assembly GetAssemblyEmbedded(string pAssemblyDisplayName)
public static System.Reflection.Assembly GetAssemblyDLL(string pAssemblyNameDLL)
{
System.Reflection.Assembly tMyAssembly = null;
if (string.IsNullOrEmpty(pAssemblyNameDLL)) { return tMyAssembly; }
try //try #a
{
if (!pAssemblyNameDLL.ToLower().EndsWith(".dll")) { pAssemblyNameDLL += ".dll"; }
tMyAssembly = System.Reflection.Assembly.LoadFrom(pAssemblyNameDLL);
}// try #a
catch (Exception ex)
{
string m = ex.Message;
}// try #a
return tMyAssembly;
}//System.Reflection.Assembly GetAssemblyFile(string pAssemblyNameDLL)
public static string GetVersionStringFromAssembly(string pAssemblyDisplayName)
{
string tVersion = "Unknown";
System.Reflection.Assembly tMyAssembly = null;
tMyAssembly = GetAssembly(pAssemblyDisplayName);
if (tMyAssembly == null) { return tVersion; }
tVersion = GetVersionString(tMyAssembly.GetName().Version.ToString());
return tVersion;
}//string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName)
public static string GetVersionString(Version pVersion)
{
string tVersion = "Unknown";
if (pVersion == null) { return tVersion; }
tVersion = GetVersionString(pVersion.ToString());
return tVersion;
}//string GetVersionString(Version pVersion)
public static string GetVersionString(string pVersionString)
{
string tVersion = "Unknown";
string[] aVersion;
if (string.IsNullOrEmpty(pVersionString)) { return tVersion; }
aVersion = pVersionString.Split('.');
if (aVersion.Length > 0) { tVersion = aVersion[0]; }
if (aVersion.Length > 1) { tVersion += "." + aVersion[1]; }
if (aVersion.Length > 2) { tVersion += "." + aVersion[2].PadLeft(4, '0'); }
if (aVersion.Length > 3) { tVersion += "." + aVersion[3].PadLeft(4, '0'); }
return tVersion;
}//string GetVersionString(Version pVersion)
public static string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName)
{
string tVersion = "Unknown";
System.Reflection.Assembly tMyAssembly = null;
tMyAssembly = GetAssemblyEmbedded(pAssemblyDisplayName);
if (tMyAssembly == null) { return tVersion; }
tVersion = GetVersionString(tMyAssembly.GetName().Version.ToString());
return tVersion;
}//string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName)
public static string GetVersionStringFromAssemblyDLL(string pAssemblyDisplayName)
{
string tVersion = "Unknown";
System.Reflection.Assembly tMyAssembly = null;
tMyAssembly = GetAssemblyDLL(pAssemblyDisplayName);
if (tMyAssembly == null) { return tVersion; }
tVersion = GetVersionString(tMyAssembly.GetName().Version.ToString());
return tVersion;
}//string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName)
@Ben द्वारा उत्तर देना मेरे लिए उपयोगी साबित हुआ। लेकिन मुझे उत्पाद संस्करण की जांच करने की आवश्यकता थी क्योंकि यह मेरे सॉफ्टवेयर में हो रही मुख्य वृद्धि थी और सिमेंटिक संस्करण का पालन किया।
myFileVersionInfo.ProductVersion
यह तरीका मेरी उम्मीदों पर खरा उतरा
अपडेट: कार्यक्रम में स्पष्ट रूप से dll पथ का उल्लेख करने के बजाय (जैसा कि उत्पादन संस्करण में आवश्यक है), हम असेंबली का उपयोग करके उत्पाद संस्करण प्राप्त कर सकते हैं।
Assembly assembly = Assembly.GetExecutingAssembly();
FileVersionInfo fileVersionInfo =FileVersionInfo.GetVersionInfo(assembly.Location);
string ProdVersion= fileVersionInfo.ProductVersion;
हालांकि मूल प्रश्न एक वेब सेवा के लिए विशिष्ट नहीं हो सकता है, यहां एक पूर्ण परीक्षण है जिसे आप वेब सेवा गैर-कैश्ड प्रतिक्रिया और फ़ाइल संस्करण के साथ प्रदर्शित करने के लिए जोड़ सकते हैं। हम असेंबली संस्करण के बजाय फ़ाइल संस्करण का उपयोग करते हैं क्योंकि हम एक संस्करण जानना चाहते हैं, लेकिन सभी विधानसभा संस्करणों के साथ 1.0.0.0, वेब साइट को आसानी से पैच किया जा सकता है (हस्ताक्षर और मांग लिंक अभी भी सक्रिय!)। वेब एफ़आई कंट्रोलर के नाम के साथ @ क्लास @ बदलें यह सेवा अंदर एम्बेडेड है। यह वेब सेवा पर जाने के लिए अच्छा है / प्लस एक त्वरित संस्करण की जांच है।
[Route("api/testWebService")]
[AllowAnonymous]
[HttpGet]
public HttpResponseMessage TestWebService()
{
HttpResponseMessage responseMessage = Request.CreateResponse(HttpStatusCode.OK);
string loc = Assembly.GetAssembly(typeof(@Class@)).Location;
FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo(loc);
responseMessage.Content = new StringContent($"<h2>The XXXXX web service GET test succeeded.</h2>{DateTime.Now}<br/><br/>File Version: {versionInfo.FileVersion}");
responseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html");
Request.RegisterForDispose(responseMessage);
return responseMessage;
}
मैंने पाया कि इसे विन्यास के तहत web.config से जोड़ना सही मायने में गुमनाम बनाने के लिए आवश्यक है
<location path="api/testwebservice">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>