it-swarm.asia

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

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

في نماذج Windows ، يمكنني استخدام Application.StartupPath للعثور على المسار الحالي ، ولكن يبدو أن هذا غير متوفر في تطبيق وحدة التحكم.

870
JSmyth

System.Reflection.Assembly.GetExecutingAssembly() . Location1

اجمع ذلك مع System.IO.Path.GetDirectoryName إذا كان كل ما تريده هو الدليل.

1 حسب تعليق Mr.Mindor:
System.Reflection.Assembly.GetExecutingAssembly().Location تُرجع إلى المكان الذي توجد فيه الجمعية المنفذة حاليًا ، والتي قد تكون أو لا تكون حيث توجد الجمعية عند عدم التنفيذ. في حالة تجميع النسخ الاحتياطية ، ستحصل على مسار في دليل مؤقت. System.Reflection.Assembly.GetExecutingAssembly().CodeBase سيعود المسار "الدائم" للجمعية.

1097
Sam Axe

يمكنك استخدام الكود التالي للحصول على دليل التطبيق الحالي.

AppDomain.CurrentDomain.BaseDirectory
383
Sarathy

ربما متأخرة بعض الشيء ولكن هذا يستحق الذكر:

Environment.GetCommandLineArgs()[0];

أو بشكل صحيح للحصول على مسار الدليل فقط:

System.IO.Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]);

تحرير:

أشار عدد غير قليل من الأشخاص إلى أن GetCommandLineArgs غير مضمون لإرجاع اسم البرنامج. انظر الكلمة الأولى في سطر الأوامر هي اسم البرنامج فقط حسب الاصطلاح . ينص المقال على أنه "على الرغم من قلة عدد برامج Windows التي تستخدم هذا الغريب (لست على علم بأي شخص)". لذلك من الممكن "محاكاة ساخرة" GetCommandLineArgs ، لكننا نتحدث عن تطبيق وحدة التحكم. تطبيقات وحدة التحكم عادة ما تكون سريعة وقذرة. لذلك هذا يتناسب مع فلسفتيKISS.

76
Steve Mc

لأي شخص مهتم بتطبيقات الويب 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" ، وبالتالي فإن الحل الأول هو بالتأكيد غير مناسب لتطبيقات الويب.

43
rocketsarefast

كانت الإجابة أعلاه 90 ٪ من ما أحتاجه ، لكنها أعادت Uri بدلا من المسار العادي بالنسبة لي.

كما هو موضح في نشر منتديات MSDN ، كيفية تحويل مسار URI إلى filepath العادي؟ ، استخدمت ما يلي:

// Get normal filepath of this Assembly's permanent directory
var path = new Uri(
    System.IO.Path.GetDirectoryName(
        System.Reflection.Assembly.GetExecutingAssembly().CodeBase)
    ).LocalPath;
36
fizzled

قد تبحث للقيام بذلك:

System.IO.Path.GetDirectoryName(
    System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
27
PSU_Kardi

يمكنك استخدام هذا واحد بدلا من ذلك.

System.Environment.CurrentDirectory
23
ButtShock

بالنسبة لتطبيقات وحدة التحكم ، يمكنك تجربة هذا:

System.IO.Directory.GetCurrentDirectory();

الإخراج (على الجهاز المحلي):

c:\users\xxxxxxx\documents\visual visual 2012\Projects\ImageHandler\GetDir\bin\Debug

أو يمكنك تجربة (هناك شرطة مائلة عكسية إضافية في النهاية):

AppDomain.CurrentDomain.BaseDirectory

انتاج:

c:\users\xxxxxxx\documents\visual visual 2012\Projects\ImageHandler\GetDir\bin\Debug \

20
F.Alves

لقد استخدمت هذا الرمز والحصول على الحل.

AppDomain.CurrentDomain.BaseDirectory
15
Trimantra Software Solution

إذا كنت تبحث عن طريقة متوافقة مع .NET Core ، فاستخدمها

System.AppContext.BaseDirectory

تم تقديم ذلك في .NET Framework 4.6 و .NET Core 1.0 (و .NET Standard 1.3). راجع: AppContext.BaseDirectory Property .

حسب هذه الصفحة ،

هذا هو البديل المفضل لـ AppDomain.CurrentDomain.BaseDirectory في .NET Core

12
Dejan

يمكنك ببساطة إضافة إلى مراجع مشروعك System.Windows.Forms ثم استخدام System.Windows.Forms.Application.StartupPath كالمعتاد.

لذلك ، لا تحتاج إلى طرق أكثر تعقيدًا أو استخدام الانعكاس.

8
fruggiero

لقد استخدمت

System.AppDomain.CurrentDomain.BaseDirectory

عندما أرغب في العثور على مسار نسبة إلى مجلد التطبيقات. هذا يعمل مع كل من ASP.Net وتطبيقات winform. كما لا يتطلب أي إشارة إلى التجميعات System.Web.

8
user2346593

أنا استخدم هذا إذا كان من المفترض أن يتم استدعاء إكس عن طريق النقر المزدوج عليه

var thisPath = System.IO.Directory.GetCurrentDirectory();
8
developer747

يعني ، لماذا لا طريقة p/استدعاء؟

    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");
7
user3596865

في VB.net

My.Application.Info.DirectoryPath

يعمل بالنسبة لي (نوع التطبيق: مكتبة الفئة). غير متأكد من C # ... إرجاع المسار بدون اسم الملف كسلسلة

5
dba

Assembly.GetEntryAssembly().Location أو Assembly.GetExecutingAssembly().Location

استخدم مع System.IO.Path.GetDirectoryName() للحصول على الدليل فقط.

يمكن أن تختلف المسارات من GetEntryAssembly() و GetExecutingAssembly() ، على الرغم من أن الدليل سيكون في معظم الحالات هو نفسه.

مع GetEntryAssembly() ، يجب أن تكون على دراية بأن هذا يمكن أن يعود null إذا كانت وحدة الإدخال غير مُدارة (أي C++ أو VB6 قابلة للتنفيذ). في هذه الحالات ، من الممكن استخدام GetModuleFileName من Win32 API:

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern int GetModuleFileName(HandleRef hModule, StringBuilder buffer, int length);
5
Herman
AppDomain.CurrentDomain.BaseDirectory

سيتم حل المشكلة لإحالة ملفات مرجعية الطرف الثالث مع حزم التثبيت.

5
Nirav Mehta

السطر التالي سوف يمنحك مسار التطبيق:

var applicationPath = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)

الحل أعلاه يعمل بشكل صحيح في المواقف التالية:

  • تطبيق بسيط
  • في مجال آخر حيث Assembly.GetEntryAssembly () سيعود فارغة
  • يتم تحميل DLL من الموارد المضمنة كصفيف بايت وتحميلها إلى AppDomain كـ Assembly.Load (byteArrayOfEmbeddedDll)
5
user2126375

جرب هذا السطر البسيط من الكود:

 string exePath = Path.GetDirectoryName( Application.ExecutablePath);
2
daniele3004

لا تعمل أي من هذه الطرق في حالات خاصة مثل استخدام رابط رمزي إلى exe ، فإنها ستعيد موقع الرابط وليس exe الفعلي.

لذلك يمكن استخدام 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) + @"\";
    }
}
2
colin lamarre

يمكنك استخدام الكود التالي ، سوف تحصل على التطبيق الكامل للمسار:

 class Program
{
    static void Main(string[] args)
    {
        string AppPath = System.Reflection.Assembly.GetExecutingAssembly().Location;
        WriteLine($"ApplicationPath ---{AppPath}");
        //OutPut// //ApplicationPath---C:\Users\TestUser\source\repos\ThreadStack\ThreadStack\bin\Debug\ThreadStack.exe
        ReadLine();
    }
}  
0
Sunil Dhappadhule

هناك العديد من الطرق للحصول على المسار القابل للتنفيذ ، والذي يجب أن نستخدمه يعتمد على احتياجاتنا هنا هو الرابط الذي يناقش الطرق المختلفة.

طرق مختلفة للحصول على مسار التطبيق القابل للتنفيذ

0
Nasir Mahmood

لم أر أي شخص يقوم بتحويل LocalPath الذي يوفره انعكاس .Net Core إلى مسار System.IO صالح للاستعمال ، لذا فإليك الإصدار الخاص بي.

public static string GetApplicationRoot()
{
   var exePath = new Uri(System.Reflection.
   Assembly.GetExecutingAssembly().CodeBase).LocalPath;

   return new FileInfo(exePath).DirectoryName;

}

سيؤدي هذا إلى إرجاع المسار المنسق "C:\xxx\xxx" بالكامل إلى مكان رمزك.

0
mark gamache