كيف يمكنني الحصول على التطبيق المسار في .NET وحدة التحكم التطبيق ؟

StackOverflow https://stackoverflow.com/questions/837488

سؤال

كيف يمكنني العثور على التطبيق المسار في تطبيق وحدة تحكم?

في نماذج 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);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top