كيف يمكنني الحصول على التطبيق المسار في .NET وحدة التحكم التطبيق ؟
-
10-07-2019 - |
سؤال
كيف يمكنني العثور على التطبيق المسار في تطبيق وحدة تحكم?
في نماذج Windows, يمكنني استخدام Application.StartupPath
العثور على المسار الحالي ، ولكن هذا لا يبدو أن تكون متاحة في تطبيق وحدة تحكم.
المحلول
System.Reflection.Assembly.GetExecutingAssembly()
. <أ href = ل "https://docs.microsoft.com/en-us/dotnet/api/system.reflection.assembly.location" يختلط = "noreferrer"> Location
<سوب> 1 سوب>
System.IO.Path.GetDirectoryName
إذا كان كل تريده هو الدليل.
<سوب> 1 في وفقا لتعليق Mr.Mindor ل: م>
عودة System.Reflection.Assembly.GetExecutingAssembly().Location
حيث يقع التجمع المنفذة حاليا، والتي قد تكون أو لا تكون حيث يقع التجمع عند عدم التنفيذ. في حالة التجمعات الظل النسخ، وسوف تحصل على المسار في دليل مؤقت. System.Reflection.Assembly.GetExecutingAssembly().CodeBase
سيعود مسار "الدائم" ل التجمع.
نصائح أخرى
ويمكنك استخدام التعليمات البرمجية التالية للحصول على دليل التطبيق الحالي.
AppDomain.CurrentDomain.BaseDirectory
ولديك خياران للعثور على دليل التطبيق، التي اخترت سيعتمد على الغرض الخاص.
// to get the location the assembly is executing from
//(not necessarily where the it normally resides on disk)
// in the case of the using shadow copies, for instance in NUnit tests,
// this will be in a temp directory.
string path = System.Reflection.Assembly.GetExecutingAssembly().Location;
//To get the location the assembly normally resides on disk or the install directory
string path = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;
//once you have the path you get the directory with:
var directory = System.IO.Path.GetDirectoryName(path);
ربما تأخرت قليلا ولكن هذا يستحق الذكر:
Environment.GetCommandLineArgs()[0];
أو أكثر بشكل صحيح للحصول على مسار الدليل:
System.IO.Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]);
تحرير:
عدد قليل جدا من الناس قد أشارت إلى أن GetCommandLineArgs
ليس مضمونا أن يعود اسم البرنامج.انظر أول كلمة في سطر الأوامر هو اسم البرنامج فقط من خلال الاتفاقية.هل المادة إلى أنه "على الرغم للغاية بعض برامج ويندوز استخدام هذه شاءت (أنا لست على علم بأي نفسي)".لذلك فمن الممكن أن 'محاكاة ساخرة' GetCommandLineArgs
, ولكن نحن نتحدث عن تطبيق وحدة التحكم.تطبيقات وحدة التحكم عادة ما تكون سريعة وقذرة.لذلك هذا يناسب مع قبلة الفلسفة.
لأي شخص مهتم في asp.net تطبيقات الويب. هنا هي بلدي نتائج 3 طرق مختلفة
protected void Application_Start(object sender, EventArgs e)
{
string p1 = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
string p2 = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
string p3 = this.Server.MapPath("");
Console.WriteLine("p1 = " + p1);
Console.WriteLine("p2 = " + p2);
Console.WriteLine("p3 = " + p3);
}
ونتيجة
p1 = C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\a897dd66\ec73ff95\assembly\dl3\ff65202d\29daade3_5e84cc01
p2 = C:\inetpub\SBSPortal_staging\
p3 = C:\inetpub\SBSPortal_staging
هو التطبيق تشغيل جسديا من "C: \ inetpub \ SBSPortal_staging"، وبالتالي فإن الحل الأول هو بالتأكيد غير مناسب لتطبيقات الويب
وفوق كان الجواب 90٪ من ما احتاجه، ولكن عاد يوري بدلا من مسار منتظم بالنسبة لي.
وكما هو موضح في المحافل MSDN الرد، <وأ href = "http://social.msdn.microsoft.com/Forums/ar/csharplanguage/thread/9341a48b-5c23-4b54-a354-2e21732cbea5" يختلط = "noreferrer "> كيفية تحويل مسار URI لأسم دليل العادي ، وأنا استخدم ما يلي:؟
// Get normal filepath of this assembly's permanent directory
var path = new Uri(
System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().CodeBase)
).LocalPath;
ويمكنك أن تبحث للقيام بذلك:
System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
ويمكنك استخدام هذه واحدة بدلا من ذلك.
System.Environment.CurrentDirectory
لتطبيقات وحدة التحكم، يمكنك أن تجرب هذا:
System.IO.Directory.GetCurrentDirectory();
والإخراج (على آلة المحلية):
<اقتباس فقرة>ج: \ المستخدمين \ XXXXXXX \ المستندات \ البصرية ستوديو 2012 \ مشاريع \ ImageHandler \ GetDir \ بن \ تصحيح
اقتباس فقرة>وأو يمكنك محاولة (هناك مائل إضافي في النهاية):
AppDomain.CurrentDomain.BaseDirectory
وإخراج:
<اقتباس فقرة>ج: \ المستخدمين \ XXXXXXX \ المستندات \ البصرية ستوديو 2012 \ مشاريع \ ImageHandler \ GetDir \ بن \ تصحيح \
اقتباس فقرة>ولقد استخدمت هذا الرمز والحصول على حل.
AppDomain.CurrentDomain.BaseDirectory
إذا كنت تبحث عن .صافي الأساسية متوافقة طريقة استخدام
System.AppContext.BaseDirectory
هذا وقد عرض في .NET Framework 4.6 و .صافي النواة 1.0 (و .صافي القياسي 1.3).انظر: AppContext.BaseDirectory.
وفقا هذه الصفحة,
هذا هو يفضل استبدال AppDomain.CurrentDomain.BaseDirectory في .صافي الأساسية
ولقد استخدمت
System.AppDomain.CurrentDomain.BaseDirectory
وعندما أريد أن أجد مسار نسبة إلى مجلد التطبيقات. هذا يعمل لكلا ASP.Net والتطبيقات winform. كما أنها لا تتطلب أي إشارة إلى المجالس System.Web.
ويمكنك ببساطة إضافة إلى حسابك في مراجع المشروع System.Windows.Forms
ثم استخدام System.Windows.Forms.Application.StartupPath
كالمعتاد.
وهكذا، وليس بحاجة لأساليب أكثر تعقيدا أو باستخدام التفكير.
وأنا استخدم هذا إذا كان من المفترض إكس ليتم استدعاؤها من خلال النقر عليه مرتين
var thisPath = System.IO.Directory.GetCurrentDirectory();
وأعني، لماذا لا ف / استدعاء الأسلوب؟
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
public class AppInfo
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto, ExactSpelling = false)]
private static extern int GetModuleFileName(HandleRef hModule, StringBuilder buffer, int length);
private static HandleRef NullHandleRef = new HandleRef(null, IntPtr.Zero);
public static string StartupPath
{
get
{
StringBuilder stringBuilder = new StringBuilder(260);
GetModuleFileName(NullHandleRef, stringBuilder, stringBuilder.Capacity);
return Path.GetDirectoryName(stringBuilder.ToString());
}
}
}
هل استخدامها تماما مثل Application.StartupPath:
Console.WriteLine("The path to this executable is: " + AppInfo.StartupPath + "\\" + System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe");
السطر التالي سوف تعطيك مسار التطبيق:
var applicationPath = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)
فوق الحل يعمل بشكل صحيح في الحالات التالية:
- التطبيق بسيط
- في مجال آخر حيث الجمعية.GetEntryAssembly() سيعود null
- يتم تحميل DLL من الموارد المضمنة كما صفيف بايت و تحميل AppDomain الجمعية.تحميل(byteArrayOfEmbeddedDll)
وAssembly.GetEntryAssembly().Location
أو Assembly.GetExecutingAssembly().Location
استخدم في تركيبة مع System.IO.Path.GetDirectoryName()
للحصول فقط على الدليل.
والمسارات من GetEntryAssembly()
وGetExecutingAssembly()
يمكن أن تكون مختلفة، على الرغم من أن معظم الحالات الدليل سوف تكون هي نفسها.
ومع GetEntryAssembly()
عليك أن تكون على علم بأن هذا يمكن أن تعود null
إذا وحدة الإدخال غير المدارة (أي C ++ أو VB6 للتنفيذ). في تلك الحالات، من الممكن استخدام GetModuleFileName
من API Win32 و:
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern int GetModuleFileName(HandleRef hModule, StringBuilder buffer, int length);
AppDomain.CurrentDomain.BaseDirectory
هل لحل هذه القضية إلى إحالة الملفات المرجعية 3rd الطرف مع حزم التثبيت.
وفي VB.net
My.Application.Info.DirectoryPath
ويعمل بالنسبة لي (نوع التطبيق: مكتبة الفئات). غير متأكدة من C # ... إرجاع المسار ث / س اسم الملف كسلسلة
وأي من هذه الأساليب يعمل في حالات خاصة مثل استخدام ارتباط رمزي إلى إكس، وسوف يعودون موقع صلة لا إكس الفعلي.
وهكذا يمكن استخدام QueryFullProcessImageName للالتفاف على ما يلي:
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using System.Diagnostics;
internal static class NativeMethods
{
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern bool QueryFullProcessImageName([In]IntPtr hProcess, [In]int dwFlags, [Out]StringBuilder lpExeName, ref int lpdwSize);
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern IntPtr OpenProcess(
UInt32 dwDesiredAccess,
[MarshalAs(UnmanagedType.Bool)]
Boolean bInheritHandle,
Int32 dwProcessId
);
}
public static class utils
{
private const UInt32 PROCESS_QUERY_INFORMATION = 0x400;
private const UInt32 PROCESS_VM_READ = 0x010;
public static string getfolder()
{
Int32 pid = Process.GetCurrentProcess().Id;
int capacity = 2000;
StringBuilder sb = new StringBuilder(capacity);
IntPtr proc;
if ((proc = NativeMethods.OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, pid)) == IntPtr.Zero)
return "";
NativeMethods.QueryFullProcessImageName(proc, 0, sb, ref capacity);
string fullPath = sb.ToString(0, capacity);
return Path.GetDirectoryName(fullPath) + @"\";
}
}
جرب هذا الخط بسيط من التعليمات البرمجية:
string exePath = Path.GetDirectoryName( Application.ExecutablePath);
وهناك حل آخر هو استخدام المسارات النسبية لافتا إلى المسار الحالي:
Path.GetFullPath(".")
وأنا لم أرى أحدا تحويل LocalPath المقدمة من انعكاس صافي الأساسية في مسار System.IO صالحة للاستعمال حتى هنا هو الإصدار بلدي.
public static string GetApplicationRoot()
{
var exePath = new Uri(System.Reflection.
Assembly.GetExecutingAssembly().CodeBase).LocalPath;
return new FileInfo(exePath).DirectoryName;
}
وهذا سيعود الكامل "C: \ XXX \ XXX" تنسيق المسار إلى حيث الشفرة هو.
هناك العديد من الطرق للحصول على المسار القابل للتنفيذ الذي علينا استخدام ذلك يعتمد على احتياجاتنا هنا هو رابط مناقشة أساليب مختلفة.
هنا هو حل موثوق بها أن تعمل مع 32bit و 64bit التطبيقات.
إضافة هذه المراجع:
باستخدام النظام.التشخيص ؛
باستخدام النظام.الإدارة ؛
إضافة هذا الأسلوب إلى المشروع الخاص بك:
public static string GetProcessPath(int processId)
{
string MethodResult = "";
try
{
string Query = "SELECT ExecutablePath FROM Win32_Process WHERE ProcessId = " + processId;
using (ManagementObjectSearcher mos = new ManagementObjectSearcher(Query))
{
using (ManagementObjectCollection moc = mos.Get())
{
string ExecutablePath = (from mo in moc.Cast<ManagementObject>() select mo["ExecutablePath"]).First().ToString();
MethodResult = ExecutablePath;
}
}
}
catch //(Exception ex)
{
//ex.HandleException();
}
return MethodResult;
}
الآن استخدامه هكذا:
int RootProcessId = Process.GetCurrentProcess().Id;
GetProcessPath(RootProcessId);
لاحظ أنه إذا كنت تعرف معرف العملية, ثم هذا الأسلوب سوف يعود المقابلة ExecutePath.
إضافية للراغبين:
Process.GetProcesses()
...سوف أعطيك مجموعة من جميع العمليات قيد التشغيل حاليا ، ...
Process.GetCurrentProcess()
...سوف تعطيك العملية الحالية ، جنبا إلى جنب مع المعلومات الخاصة بهم مثلاId, الخ.و أيضا سيطرة محدودة على سبيل المثالقتل ، إلخ.*
يمكنك إنشاء اسم المجلد مثل الموارد ضمن المشروع باستخدام مستكشف الحلول، ثم يمكنك لصق ملف ضمن الموارد.
private void Form1_Load(object sender, EventArgs e) {
string appName = Environment.CurrentDirectory;
int l = appName.Length;
int h = appName.LastIndexOf("bin");
string ll = appName.Remove(h);
string g = ll + "Resources\\sample.txt";
System.Diagnostics.Process.Start(g);
}