c# - সিস্টেম সফটওয়্যার কাকে বলে




আমি কিভাবে একটি.NET কনসোল অ্যাপ্লিকেশন অ্যাপ্লিকেশন এর পথ পেতে পারেন? (18)

আমি কিভাবে একটি কনসোল অ্যাপ্লিকেশন অ্যাপ্লিকেশন এর পথ খুঁজে পেতে পারি?

উইন্ডোজ ফর্মে , আমি বর্তমান পাথটি খুঁজে পেতে Application.StartupPath ব্যবহার করতে পারি, কিন্তু এটি একটি কনসোল অ্যাপ্লিকেশনে উপলব্ধ বলে মনে হচ্ছে না।


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" থেকে চলছে, তাই প্রথম সমাধান স্পষ্টভাবে ওয়েব অ্যাপ্লিকেশনের জন্য উপযুক্ত নয়।


VB.net মধ্যে

My.Application.Info.DirectoryPath

আমার জন্য কাজ করে (অ্যাপ্লিকেশন প্রকার: ক্লাস লাইব্রেরি)। C # সম্পর্কে নিশ্চিত না ... পাথটি w / o ফাইলের নাম স্ট্রিং হিসাবে ফেরত দেয়


আপনি এই কাজ খুঁজছেন হতে পারে:

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

আপনি নিম্নলিখিত কোড ব্যবহার করতে পারেন, আপনি আবেদন পূর্ণ পথ পাবেন:

 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();
    }
}  

আপনি বর্তমান অ্যাপ্লিকেশন ডিরেক্টরি পেতে নিম্নলিখিত কোড ব্যবহার করতে পারেন।

AppDomain.CurrentDomain.BaseDirectory

আপনি যদি একটি .NET কোর সামঞ্জস্যপূর্ণ উপায় খুঁজছেন হয়, ব্যবহার করুন

System.AppContext.BaseDirectory

এটি .NET Framework 4.6 এবং .NET Core 1.0 (এবং .NET স্ট্যান্ডার্ড 1.3) -এ চালু করা হয়েছিল। দেখুন: AppContext.BaseDirectory সম্পত্তি

এই পৃষ্ঠার মতে,

এটি .NET কোর এ AppDomain.CurrentDomain.BaseDirectory এর জন্য পূর্বনির্ধারিত প্রতিস্থাপন


আপনি সহজেই আপনার প্রকল্প রেফারেন্স System.Windows.Forms যোগ করতে পারেন। System.Windows.Forms এবং তারপরে System.Windows.Forms.Application.StartupPath ব্যবহার করুন।

তাই, আরো জটিল পদ্ধতির জন্য বা প্রতিফলন ব্যবহার করার প্রয়োজন হয় না।


আমি এই কোড ব্যবহার করেছেন এবং সমাধান পেতে।

AppDomain.CurrentDomain.BaseDirectory

আমি বলতে চাচ্ছি, কেন এপি / পদ্ধতি আহ্বান না?

    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());
                }
            }
    }

আপনি শুধু অ্যাপ্লিকেশন মত এটি ব্যবহার করা হবে। স্টার্টআপপথ:

    Console.WriteLine("The path to this executable is: " + AppInfo.StartupPath + "\\" + System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe");

আমি ব্যবহার করেছি

System.AppDomain.CurrentDomain.BaseDirectory

যখন আমি একটি অ্যাপ্লিকেশন ফোল্ডার আপেক্ষিক একটি পাথ খুঁজে পেতে চান। এটি ASP.Net এবং Winform অ্যাপ্লিকেশন উভয় জন্য কাজ করে। এটি System.Web assemblies এর কোনো রেফারেন্স প্রয়োজন নেই।


এই পদ্ধতিগুলির মধ্যে কোনটি 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) + @"\";
    }
}

এক্সিকিউটেবল পথ পেতে অনেক উপায় আছে, আমরা এটি ব্যবহার করতে যাচ্ছি এখানে আমাদের প্রয়োজনের উপর নির্ভর করে একটি লিঙ্ক যা বিভিন্ন পদ্ধতি নিয়ে আলোচনা করে।

অ্যাপ্লিকেশন এক্সিকিউটেবল পথ পেতে বিভিন্ন উপায়


এখানে একটি নির্ভরযোগ্য সমাধান যা 32 বিট এবং 64 বিট অ্যাপ্লিকেশনের সাথে কাজ করে।

এই রেফারেন্স যোগ করুন:

System.Diagnostics ব্যবহার করে;

System.Management ব্যবহার করে;

আপনার প্রকল্পে এই পদ্ধতি যোগ করুন:

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

লক্ষ্য করুন যে যদি আপনি প্রক্রিয়াটির আইডিটি জানেন তবে এই পদ্ধতিটি সংশ্লিষ্ট এক্সিকিউটপথটি ফেরত দেবে।

অতিরিক্ত, আগ্রহী যারা জন্য:

Process.GetProcesses() 

... আপনি সমস্ত চলমান প্রসেসের একটি অ্যারে দিতে হবে, এবং ...

Process.GetCurrentProcess()

... আপনার বর্তমান তথ্য যেমন আইডি ইত্যাদি সহ বর্তমান প্রক্রিয়াটি সরবরাহ করবে এবং সীমিত নিয়ন্ত্রণ ইত্যাদি হত্যা ইত্যাদি *


কনসোল অ্যাপ্লিকেশনগুলির জন্য, আপনি এটি ব্যবহার করতে পারেন:

System.IO.Directory.GetCurrentDirectory();

আউটপুট (আমার স্থানীয় মেশিনে):

গ: \ ব্যবহারকারী \ xxxxxxx \ নথি \ চাক্ষুষ স্টুডিও 2012 \ প্রকল্প \ চিত্রহ্যান্ডলার \ GetDir \ bin \ ডিবাগ

অথবা আপনি চেষ্টা করতে পারেন (শেষে একটি অতিরিক্ত ব্যাকস্ল্যাশ আছে):

AppDomain.CurrentDomain.BaseDirectory

আউটপুট:

গ: \ ব্যবহারকারী \ xxxxxxx \ নথি \ চাক্ষুষ স্টুডিও 2012 \ প্রকল্প \ চিত্রহ্যান্ডলার \ GetDir \ bin \ ডিবাগ \


নিম্নলিখিত লাইন আপনাকে একটি অ্যাপ্লিকেশন পথ দিতে হবে:

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

উপরের সমাধান নিম্নলিখিত পরিস্থিতিতে সঠিকভাবে কাজ করছে:

  • সহজ অ্যাপ্লিকেশন
  • অন্য ডোমেইন যেখানে Assembly.GetEntryAssembly () নল ফিরে আসবে
  • ডিএলএল এমবেডেড সংস্থান থেকে বাইট অ্যারে হিসাবে লোড করা হয় এবং অ্যাডডোমাইনে লোড হচ্ছে অ্যাসেম্বলি হিসাবে। লোড (byteArrayOfEmbeddedDll)

সম্ভবত একটি বিট দেরী কিন্তু এই একটি উল্লেখযোগ্য মূল্য:

Environment.GetCommandLineArgs()[0];

অথবা সঠিকভাবে ডিরেক্টরি পথ পেতে আরো সঠিকভাবে:

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

সম্পাদনা:

বেশ কিছু লোক লক্ষ্য করেছেন যে GetCommandLineArgs প্রোগ্রাম নামটি ফেরত দেওয়ার জন্য নিশ্চিত নয়। কমান্ড লাইনের প্রথম শব্দ শুধুমাত্র কনভেনশন দ্বারা প্রোগ্রাম নাম দেখুন । নিবন্ধটিতে বলা হয়েছে যে "যদিও খুব কম উইন্ডোজ প্রোগ্রাম এই কুইক ব্যবহার করে (আমি নিজের সম্পর্কে সচেতন নই)"। সুতরাং GetCommandLineArgs 'spoof' করা সম্ভব, কিন্তু আমরা একটি কনসোল অ্যাপ্লিকেশন সম্পর্কে কথা বলছি। কনসোল অ্যাপ্লিকেশন সাধারণত দ্রুত এবং নোংরা। তাই এই আমার KISS দর্শন সঙ্গে ফিট করে।


Assembly.GetEntryAssembly().Location বা Assembly.GetExecutingAssembly().Location

শুধুমাত্র ডিরেক্টরি পেতে System.IO.Path.GetDirectoryName() সাথে সংমিশ্রণে ব্যবহার করুন।

GetEntryAssembly() এবং GetExecutingAssembly() থেকে GetEntryAssembly() ভিন্ন হতে পারে, যদিও বেশিরভাগ ক্ষেত্রেই ডিরেক্টরিটি একই রকম হবে।

GetEntryAssembly() আপনাকে সচেতন থাকতে হবে যে এন্ট্রি মডিউলটি যদি পরিচালিত না হয় (এটি সি ++ বা VB6 এক্সিকিউটেবল) তাহলে এটি null ফিরে পেতে পারে। সেই ক্ষেত্রে Win32 API থেকে GetModuleFileName ব্যবহার করা সম্ভব:

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

AppDomain.CurrentDomain.BaseDirectory

ইনস্টলেশন প্যাকেজের সাথে তৃতীয় পক্ষের রেফারেন্স ফাইলগুলি উল্লেখ করার জন্য সমস্যাটি সমাধান করবে।





console-application