ऊपर जवाब के अलावा।
मैं सांत्वना आवेदन
static void Main(string[] args) {
Console.WriteLine(
System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);
Console.WriteLine(
System.Reflection.Assembly.GetEntryAssembly().Location);
Console.WriteLine(
System.Reflection.Assembly.GetExecutingAssembly().Location);
Console.WriteLine(
System.Reflection.Assembly.GetCallingAssembly().Location);
}
तब मैं परियोजना संकलित रूप में निम्नलिखित test.exe लिखा था और test2.exe फाइल करने के लिए इसके उत्पादन का नया नाम दिया। आउटपुट लाइनें सही थीं और वही थीं।
लेकिन, अगर मैं दृश्य स्टूडियो में इसे शुरू, परिणाम है:
घ: \ test2.vhost.exe
घ: \ test2.exe
घ: \ test2.exe
C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ mscorlib.dll
विजुअल स्टूडियो में रीशेपर प्लग-इन ने
System.Diagnostics.Process.GetCurrentProcess().MainModule
संभव सिस्टम के रूप में रेखांकित किया है।शून्य संदर्भ अपवाद। यदि आप मेन मॉड्यूल के दस्तावेज़ीकरण को देखते हैं तो आप पाएंगे कि यह संपत्ति भी समर्थित नहीं है अपवादित अपवाद, प्लेटफ़ॉर्म नॉट समर्थितपोर्ट अपवाद और अवैधऑपरेशन अपवाद।
GetEntryAssembly विधि भी 100% "सुरक्षित" नहीं है। MSDN:
GetEntryAssembly विधि अशक्त लौट सकते हैं जब एक कामयाब विधानसभा एक अप्रबंधित आवेदन से लोड किया गया है। उदाहरण के लिए, यदि अप्रबंधित एप्लिकेशन सी # घटक सी # में लिखित एक COM घटक का एक उदाहरण बनाता है, तो सी # घटक से GetEntryAssembly विधि को कॉल शून्य देता है, क्योंकि प्रक्रिया के लिए प्रविष्टि बिंदु प्रबंधित प्रबंधित असेंबली के बजाय कोड अप्रबंधित था ।
मेरे समाधान के लिए, मैं Assembly.GetEntryAssembly().Location
पसंद करता हूं।
वर्चुअलाइजेशन के लिए समस्या को हल करने की आवश्यकता होने पर अधिक रुचि है। उदाहरण के लिए, हमारे पास एक प्रोजेक्ट है, जहां हम एक निष्पादन योग्य में .NET कोड को लिंक करने के लिए ज़ेनोकोड पोस्टबिल्ड का उपयोग करते हैं। इस निष्पादन योग्य का नाम बदला जाना चाहिए। तो उपर्युक्त सभी विधियां काम नहीं करतीं, क्योंकि उन्हें केवल मूल असेंबली या आंतरिक प्रक्रिया के लिए जानकारी मिलती है।
एकमात्र समाधान मैंने पाया
var location = System.Reflection.Assembly.GetEntryAssembly().Location;
var directory = System.IO.Path.GetDirectoryName(location);
var file = System.IO.Path.Combine(directory,
System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe");
यह एक ".vost" जोड़ने के लिए जाता है। फ़ाइल नाम में, System.Reflection.Assembly.GetEntryAssembly() का उपयोग करते समय कोई समस्या मौजूद नहीं है। स्थान (वैकल्पिक उत्तर देखें)। – Contango
@Contango, जो वीएस में "विजुअल स्टूडियो होस्टिंग प्रोसेस" का उपयोग करके होता है। – LuddyPants
वीएस 2012 में यूनिट परीक्षण के लिए। प्रक्रिया नाम: vstest.executionengine.x86 कॉन्फ़िगरेशनफ़ाइल: सी: \ टीएफएस \ टेस्ट \ MyData.Tests.v4.0 \ bin \ Debug \ MyData.Tests.v4.0.dll.config MainModule.FileName: C: \ Program Files (x86) \ माइक्रोसॉफ्ट विजुअल स्टूडियो 11.0 \ Common7 \ IDE \ COMMONEXTENSIONS \ Microsoft \ TESTWINDOW \ MainModule.ModuleName vstest.executionengine.x86.exe: vstest.executionengine.x86.exe FriendlyName : यूनिटटेस्ट एडाप्टर: रनिंग टेस्ट – Kiquenet