কোডটি কীভাবে আমি সমাবেশের পথে পাব?


780

যে সমাবেশে বর্তমান কোডটি রয়েছে সেখানে যাওয়ার জন্য কি কোনও উপায় আছে? কোডিং সমাবেশের পথটি আমি চাই না, কেবল কোডটি সম্বলিত একটি।

মূলত আমার ইউনিট পরীক্ষায় কিছু এক্সএমএল টেস্ট ফাইল পড়তে হবে যা dll এর সাথে সম্পর্কিত। আমি পরীক্ষার dll টেস্টড্রাইভেন.এনইটি, এমবিউনিত জিইউআই বা অন্য কোনও কিছু থেকে চালিত কিনা তা নির্বিশেষে পথটি সর্বদা সঠিকভাবে সমাধানের জন্য চাই।

সম্পাদনা : আমি যা বলছি তা লোকেরা ভুল বুঝাবুঝি করছে।

আমার পরীক্ষা লাইব্রেরি বলতে বলা হয়

সি: \ প্রকল্প \ myapplication \ daotests \ বিন \ ডিবাগ \ daotests.dll

এবং আমি এই পথ পেতে চাই:

সি: \ প্রকল্প \ myapplication \ daotests \ বিন \ ডিবাগ \

আমি এমবিউনিত গুই থেকে চালানোর সময় এ পর্যন্ত তিনটি পরামর্শ আমাকে ব্যর্থ করেছে:

  • Environment.CurrentDirectory দেয় \ প্রোগ্রাম ফাইল \ MbUnit: গ

  • System.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Locationসি দেয় : ডকুমেন্টস এবং সেটিংস \ জর্জ orge স্থানীয় সেটিংস \ টেম্প \ .... \ দাওটেষ্ট.ডিল

  • System.Reflection.Assembly.GetExecutingAssembly().Location আগের মত একই দেয়।


102
এটি আপনার সমাধান: var dir = AppDomain.CurrentDomain.BaseDirectory;
জালাল এল-শায়ের

7
এটি গ্রহণযোগ্য সমাধান হওয়া উচিত। অ্যাপডোমাইন.কন্টেনডোমাইন.বেসডাইরেক্টরি হ'ল সঠিক পন্থা।
aBetterGamer


2
আমি এখানে একটি নুগেট প্যাকেজটির প্যাকাক ডিরেক্টরি থেকে JSON ফাইলটি পড়ার জন্য সমাধানের সন্ধান করতে এসেছি। দেখে মনে হয় যে কোনও ন্যুগেট প্যাকেজ সম্পাদন করা হলে "অ্যাপডোমাইন.কেন্দ্রডোমাইন.বেস ডিরেক্টরী" চলমান প্রকল্প ডিরেক্টরিতে নির্দেশ করে, এবং ন্যুগেট প্যাকেজ ডিরেক্টরিটি নয়। এর মধ্যে কোনওটিই নুগেট প্যাকেজ ডিরেক্টরিটি সঠিকভাবে লক্ষ্যবস্তু করে না বলে মনে হয়।
লুকাস

@ লুকাস না, কারণ এটি নয় কারণ এই প্রশ্নটি ছিল না (বাস্তবে যখন এটি জিজ্ঞাসা করা হয়েছিল, নুগেটের অস্তিত্ব ছিল না) - নতুন প্রশ্ন শুরু করতে এবং আমাকে সেখানে প্রবেশ করানোর জন্য নির্দ্বিধায় অনুভব করুন তবে আমি আপনাকে এখনই বলতে পারি যে এটি বেশিরভাগ ক্ষেত্রে অসম্ভব। বেশিরভাগ প্রকল্পের জন্য নুগেট ডিরেক্টরিটি packagesস্লেন ফাইলের পাশে থাকে। তবে আপনি যখন জিনিসগুলি সংকলন এবং বিতরণ করবেন তখন কোনও স্লেন ফাইল নেই এবং কোনও প্যাকেজ ডিরেক্টরি নেই। সংকলনের সময়, প্রয়োজনীয় জিনিসগুলি (তবে সমস্ত কিছু নয়) বিন ডিরেক্টরিতে অনুলিপি করা হয়। আপনার সেরা বেটটি হ'ল আপনার পছন্দের ফাইলটি অনুলিপি করতে একটি পোস্ট বিল্ড স্ক্রিপ্ট ব্যবহার করা।
জর্জ মাউয়ার 19

উত্তর:


1035

আমরা নিম্নলিখিত সম্পত্তিটিকে সংজ্ঞায়িত করেছি কারণ আমরা প্রায়শই ইউনিট পরীক্ষায় এটি ব্যবহার করি।

public static string AssemblyDirectory
{
    get
    {
        string codeBase = Assembly.GetExecutingAssembly().CodeBase;
        UriBuilder uri = new UriBuilder(codeBase);
        string path = Uri.UnescapeDataString(uri.Path);
        return Path.GetDirectoryName(path);
    }
}

Assembly.Locationসম্পত্তি কখনও কখনও যখন NUnit (যেখানে সমাহারগুলি একটি অস্থায়ী ফোল্ডার থেকে চালানো) ব্যবহার করে আপনি কিছু মজার ফলাফল দেয়, তাই আমি ব্যবহার করতে পছন্দ CodeBaseযা আপনি কোনো URI বিন্যাসে পথ দেয়, তারপর UriBuild.UnescapeDataStringসরিয়ে ফেলা File://শুরুতে, এবং GetDirectoryNameস্বাভাবিক জানালা ফর্ম্যাটে এটি পরিবর্তন ।


29
এটির একটি সমস্যা আমার সামনে এসেছিল, যদি আপনার ডিরেক্টরিটির নাম: c: \ আমার% 20 ডিরেক্টরি থাকে তবে উরি.উনস্কেপডেটা স্ট্রিং ফিরে আসবে: সি: \ আমার ডিরেক্টরিটির অর্থ ফাইল.এক্সিস্টস ("সি: \ আমার ডিরেক্টরি \ মাইফাইল.txt) ") সঠিক পথটি আসলে" গ: \ আমার% 20 ডিরেক্টরি \ মাইফিল.টিএসটিএক্স "হওয়ায় মিথ্যা ফিরে আসবে কারণ আমাদের এসভিএন পাথগুলিতে স্পেস রয়েছে এবং যখন আমরা সেগুলি পরীক্ষা করে দেখি এটি ফাঁকা স্থানগুলি এনকোড করে।
সারি 1

5
আপনি ফাইলটি পরীক্ষা করতে এটি ব্যবহার করার সময় সতর্কতা অবলম্বন করুন xএক্সজিস্ট () কারণ এই পদ্ধতিটি ইউএনসি পথে মিথ্যা ফিরে আসবে। পরিবর্তে @ কিথের উত্তর ব্যবহার করুন।
এজেড

3
আপনি জনগণের সামনে স্থির রাখতে পারেন জানতেন না। জেনে ভাল
লাগল

5
দ্রষ্টব্য: এটি নেটওয়ার্ক অবস্থানগুলির সাথে কাজ করে না (উদাঃ EM REMOT_EPC old ফোল্ডার)
মুক্সা

5
ডিরেক্টরিতে যদি এতে # চিহ্নের সংখ্যা থাকে তবে এটি কাজ করবে না। উইন্ডোতে ডিরেক্টরি এবং ফাইলের নামগুলিতে নম্বর চিহ্নগুলি অনুমোদিত।
হিউম্যাক

321

এটা কি সাহায্য করে?

//get the full location of the assembly with DaoTests in it
string fullPath = System.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location;

//get the folder that's in
string theDirectory = Path.GetDirectoryName( fullPath );

আমার সম্পাদনা দেখুন, এটি না, এমবিউনিত কীভাবে জিনিসগুলি করে সে সম্পর্কে এটি কি আশ্চর্যের কিছু?
জর্জ মাউয়ার

3
এক্সএমএল ফাইলগুলিকে কনটেন্ট হিসাবে সেট করুন, ডেল থেকে পড়া বা সংস্থানগুলি থেকে অনুলিপি করুন।
কিথ

22
বা কেবলtypeof(DaoTests).Assembly
স্লাকস

4
@ এসএলক্স @ জোহনিস্কভডাল @ কিথ: ওহে ছেলেরা, ব্যবহার করুন Assembly.GetExecutingAssembly()। এটি "এমন সমাবেশটি পায় যা বর্তমানে কার্যকর করা কোডটি ধারণ করে" (পদ্ধতি বর্ণনা থেকে)। আমি এটি আমার অ্যাডআইএন " এন্টিটিস টোডিটিওস" এ ব্যবহার করি । আসল উদাহরণের জন্য এসেম্বলিহেল্পার সি ।
kzfabi

4
@ জন সিলবি পোস্টটি নিয়ে সমস্যা ছিল, কারণ এটি ইউএনসি পাথের মতো কাজ করে না বলে মনে হচ্ছে ... যেমন \\ সার্ভার \ ফোল্ডার \ ফাইল.সেক্সট। এই এক কৌতুক করেছে। +1
ব্লুবেরি

312

এটি এর মতোই সহজ:

var dir = AppDomain.CurrentDomain.BaseDirectory;

11
এটি গ্রহণযোগ্য সমাধান হওয়া উচিত। অ্যাপডোমাইন.কন্টেনডোমাইন.বেসডাইরেক্টরি হ'ল সঠিক পন্থা।
aBetterGamer

5
এদিকে আমার মনোযোগ ফিরিয়ে আনার জন্য ধন্যবাদ - নিশ্চিত না যে প্রশ্নটি জিজ্ঞাসা করার সময় এটি পাওয়া গিয়েছিল তবে এটি এখন।
জর্জ মাউয়ার

120
না, এটা ভুল। এটি বর্তমানে প্রবেশকারী কোড নয় বরং মূল প্রবেশপত্রের পথ ফেরায়। আপনি যদি কোনও কোনও পাথ থেকে ম্যানুয়ালি কোনও অ্যাসেম্বলি লোড করে রেখেছেন বা এটি জিএসি থেকে লোড করা হয়েছে, তবে এটি ভুল ফলাফলটি ফিরিয়ে দেবে। এই উত্তরটি সঠিক: স্ট্যাকওভারফ্লো. com / a / 283917 / 243557 আরও দ্রুত Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
নাথানছেরে

9
প্রকৃতপক্ষে এটি ওয়েব অ্যাপ্লিকেশনগুলিতে কাজ করবে না তবে যতদূর আমি খুঁজে পেয়েছি নিম্নলিখিত বৃদ্ধিটি যে কোনও ধরণের অ্যাপ্লিকেশনের জন্য কাজ করা উচিত:AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory
ইলিয়া চেরনমর্ডিক

4
এটি ইউনিট পরীক্ষার জন্য দুর্দান্ত যদি আপনি কেবল আপনার পরীক্ষা সমাবেশের আসল বিন পাথ পেতে চান (বলুন, সাবফোল্ডারগুলিতে সহায়তার ডেটা ফাইলগুলিতে পৌঁছাতে)। পরীক্ষা সমাবেশটি আপনার কোডের এন্ট্রি পয়েন্ট।
মারিওডিএস 13

68

জন এর উত্তর হিসাবে একই, কিন্তু একটি সামান্য কম ভার্বোস এক্সটেনশন পদ্ধতি।

public static string GetDirectoryPath(this Assembly assembly)
{
    string filePath = new Uri(assembly.CodeBase).LocalPath;
    return Path.GetDirectoryName(filePath);            
}

এখন আপনি এটি করতে পারেন:

var localDir = Assembly.GetExecutingAssembly().GetDirectoryPath();

বা আপনি যদি পছন্দ করেন:

var localDir = typeof(DaoTests).Assembly.GetDirectoryPath();

6
আপনি কি assemblyপরিবর্তে বোঝাতে চেয়েছিলেন Assembly.GetExecutingAssembly()?
ড্যুড পাস্কেলু

3
ডড যেমন উল্লেখ করেছেন, আপনি একটি যুক্তিতে পাস করেছেন এবং এটি ব্যবহার করতে ব্যর্থ হয়েছেন।
ক্রিস মোসচিনি

4
এই উত্তরটি হাতে থাকা প্রশ্নের জন্য কেবল সাধারণ ভুল। এই উত্তরের একটি পরিবর্তিত সংস্করণ আপনাকে প্রদত্ত সমাবেশের পথ দিতে পারে। যাইহোক, এখানে, আমরা বিশেষভাবে কার্যকরকারী সমাবেশের সন্ধান করছি, এবং সুতরাং একটি অ্যাসেমব্লিতে পাস করার অর্থ হয় না। একটি এক্সটেনশন পদ্ধতি হ'ল কাজের জন্য ভুল সরঞ্জাম।
এডওয়ার্ড ব্রে

46

কোডবেস এবং ইউএনসি নেটওয়ার্ক শেয়ার ব্যবহার করার সময় আমার পক্ষে একমাত্র সমাধানটি ছিল:

System.IO.Path.GetDirectoryName(new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath);

এটি সাধারণ ইউআরআইয়ের সাথেও কাজ করে।


5
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। এটি সত্যিই বিরক্তিকর যে ডিফল্ট কোডবেস ইউএনসি শেয়ারগুলি সঠিকভাবে পরিচালনা করে না।
ড্যানিয়েল গিলবার্ট

ফোল্ডারে শূণ্যস্থান রয়েছে এবং
otherশ্বর

1
আমি এটি অনেক ব্যবহার করেছি এবং এমন একটি দৃশ্যের সন্ধান পেয়েছি যেখানে এটি ব্যর্থ হয়: যদি কোডটির এই লাইনটি নিজেই কোনও নিউগেট প্যাকেজের অংশ হয় যা তখন কোনও অ্যাপ্লিকেশন দ্বারা ব্যবহৃত হয়! আমরা প্রতিস্থাপন খুব যে দৃশ্যকল্প সমর্থন করতে পারে না GetExecutingAssembly()দ্বারা GetCallingAssembly()
টিমো

@ টিমো: এই পরিবর্তনের পার্শ্ব প্রতিক্রিয়া থাকলে আপনি কি যাচাই করেছেন? যদি তা হয় তবে দয়া করে ঠিক করার জন্য উত্তরটি সম্পাদনা করুন।
ইগনাসিও সোলার গার্সিয়া

@ ইগনাসিওসোলারগার্সিয়া দুঃখের সাথে আমার অবশ্যই জানাতে হবে যে এটি কেবল এক স্তর গভীরভাবে কাজ করেছে, অর্থাত্ যদি নুগেট প্যাকেজটিকে অন্য নুগেট প্যাকেজ দ্বারা ডাকা হয় তবে এটি ব্যর্থ হয়! আমি এখন এই ব্যবহার করছি (Chernomordik দ্বারা এই পাতায় একটি মন্তব্য থেকে): AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory। প্রথম অংশটি ওয়েব অ্যাপ্লিকেশনগুলির জন্য এবং দ্বিতীয় অংশটি অন্যান্য অ্যাপ্লিকেশনগুলির জন্য।
টিমো

32

সমাবেশটি ছায়া অনুলিপি না করা থাকলে এটি কাজ করা উচিত :

string path = System.Reflection.Assembly.GetExecutingAssembly().Location

14

এই সম্পর্কে কি:

System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

11

আমি সন্দেহ করি যে এখানে আসল সমস্যাটি হ'ল আপনার পরীক্ষার রানার আপনার সমাবেশটি অন্য কোনও স্থানে অনুলিপি করছেন। সমাবেশটি কোথায় থেকে অনুলিপি করা হয়েছিল তা বলার কোনও উপায় নেই, তবে আপনি সম্ভবত পরীক্ষার রানারকে সমাবেশটি যেখান থেকে চালাবেন তা বলতে এবং একটি ছায়া ডিরেক্টরিতে এটি অনুলিপি না করার জন্য একটি স্যুইচটি উল্টাতে পারেন।

এই জাতীয় স্যুইচ অবশ্যই প্রতিটি পরীক্ষার রানারের জন্য আলাদা হতে পারে।

আপনি কি আপনার এক্সএমএল ডেটা আপনার পরীক্ষা সমাবেশের অভ্যন্তরে সংস্থান হিসাবে বিবেচনা করেছেন?


ছায়া অনুলিপি সহ সমস্যাটি নির্দেশ করার জন্য +1। তবে, আসল জায়গাটি নির্ধারণ করা সত্যিই সম্ভব Assembly.CodeBase
tm1

11
AppDomain.CurrentDomain.BaseDirectory

এমবিউনিত জিইউআইয়ের সাথে কাজ করে।


এটি একটি এসপিএন ওয়েব অ্যাপ্লিকেশনটিতে মূল ডিরেক্টরি সম্পর্কিত একটি ফাইল লেখার জন্য দুর্দান্ত কাজ করেছে
ফিলিপ পিটল

আমি খুঁজে পেয়েছি যে এটি সর্বোত্তমভাবে কাজ করে। আপনি যদি অনিশ্চিত হন তবে এটি চয়ন করুন।
এরিক বার্গস্টেট

10

আমি বিশ্বাস করি এটি যে কোনও ধরণের প্রয়োগের জন্য কাজ করবে:

AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory

1
আমার পরীক্ষাগুলি এটিকে সর্বাধিক নির্বোধ উত্তর হিসাবে দেখায়, কেবল ওয়েব এবং কনসোল অ্যাপ্লিকেশনগুলিকেই কভার করে না, ইউনিট পরীক্ষা এবং নুগেট প্যাকেজগুলি (পুনরাবৃত্তির যে কোনও স্তরের নেস্টেড) থেকেও ডাকে।
টিমো

8

আমি যতদূর বলতে পারি, অন্যান্য উত্তরগুলির বেশিরভাগটিতে কয়েকটি সমস্যা রয়েছে।

ডিস্ক-ভিত্তিক (ওয়েব-ভিত্তির বিপরীতে), নন-জিএসিড সমাবেশের জন্য এটি করার সঠিক উপায় হ'ল বর্তমানে সম্পাদনকারী সমাবেশের CodeBaseসম্পত্তি ব্যবহার করা।

এটি একটি ইউআরএল ( file://) প্রদান করে। স্ট্রিং ম্যানিপুলেশন বা চারপাশে গোলযোগের পরিবর্তে, UnescapeDataStringএর LocalPathসম্পত্তিটি লাভবান করে এটিকে ন্যূনতম গোলমাল দিয়ে রূপান্তর করা যায় Uri

var codeBaseUrl = Assembly.GetExecutingAssembly().CodeBase;
var filePathToCodeBase = new Uri(codeBaseUrl).LocalPath;
var directoryPath = Path.GetDirectoryName(filePathToCodeBase);

1
পাথের মধ্যে থাকলে #( EscapedCodeBaseকাজ করে তবে এস্কেপডকোডবেস কাজ না করে যদি কাজ করে না তবে পাথটিতে উদাহরণস্বরূপ ভারব্যাটিয়াম রয়েছে %20(যা একটি উইন্ডোজ পাথের একটি অনুমোদিত চরিত্রের অনুক্রম))
মার্টিন বা

আমরা একটি NuGet প্যাকেজের মধ্যে এই কোড আছে চান, আমরা প্রতিস্থাপন যে দৃশ্যকল্প ঠিক করতে পারবো GetExecutingAssembly()দ্বারা GetCallingAssembly()
টিমো

8

এই সম্পর্কে ...

string ThisdllDirectory = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

তারপরে আপনার যা প্রয়োজন নেই কেবল তা হ্যাক করুন


7
var assembly = System.Reflection.Assembly.GetExecutingAssembly();
var assemblyPath = assembly.GetFiles()[0].Name;
var assemblyDir = System.IO.Path.GetDirectoryName(assemblyPath);

7

জন সাবলির কোডের একটি ভিবি.এনইটি পোর্ট এখানে। ভিজ্যুয়াল বেসিক কেস সংবেদনশীল নয়, তাই তার কয়েকটি পরিবর্তনশীল নাম টাইপের নামের সাথে সংঘর্ষে ছিল।

Public Shared ReadOnly Property AssemblyDirectory() As String
    Get
        Dim codeBase As String = Assembly.GetExecutingAssembly().CodeBase
        Dim uriBuilder As New UriBuilder(codeBase)
        Dim assemblyPath As String = Uri.UnescapeDataString(uriBuilder.Path)
        Return Path.GetDirectoryName(assemblyPath)
    End Get
End Property

6

এই সমস্ত বছরে, কেউ আসলে এটির উল্লেখ করেনি। একটি কৌশল যা আমি দারুণ অনুমোদনের পরীক্ষার প্রকল্প থেকে শিখেছি । কৌশলটি হ'ল আপনি আসল ডিরেক্টরিটি সন্ধান করতে অ্যাসেমব্লিতে ডিবাগিং তথ্য ব্যবহার করেন।

এটি রিলিজ মোডে কাজ করবে না, অপ্টিমাইজেশান সক্ষম হবে না, বা এটি যে সংকলিত হয়েছে তার থেকে আলাদা কোনও মেশিনে কাজ করবে না।

তবে এটি আপনাকে এমন সোজা কোড ফাইলের অবস্থানের সাথে সম্পর্কিত যে রাস্তাগুলি কল করে get

public static class PathUtilities
{
    public static string GetAdjacentFile(string relativePath)
    {
        return GetDirectoryForCaller(1) + relativePath;
    }
    public static string GetDirectoryForCaller()
    {
        return GetDirectoryForCaller(1);
    }


    public static string GetDirectoryForCaller(int callerStackDepth)
    {
        var stackFrame = new StackTrace(true).GetFrame(callerStackDepth + 1);
        return GetDirectoryForStackFrame(stackFrame);
    }

    public static string GetDirectoryForStackFrame(StackFrame stackFrame)
    {
        return new FileInfo(stackFrame.GetFileName()).Directory.FullName + Path.DirectorySeparatorChar;
    }
}

5

বর্তমান ডিরেক্টরি যেখানে আপনি বিদ্যমান।

Environment.CurrentDirectory;  // This is the current directory of your application

আপনি বিল্ডের সাথে .xML ফাইলটি অনুলিপি করে থাকলে এটি খুঁজে পাওয়া উচিত।

অথবা

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetAssembly(typeof(SomeObject));

// The location of the Assembly
assembly.Location;

সমাবেশটি ছায়া অনুলিপি করা থাকলে এটি সমস্যাযুক্ত হবে ।
ব্যয়কারী

+1520! Environment.CurrentDirectoryআপনি যদি এমএসবিল্ড টাস্ক ক্লাসে প্রতিচ্ছবি ব্যবহার করছেন তবে কাজ করে, যেখানে কার্যনির্বাহী সমাবেশটি জিএসি তে থাকে এবং আপনার কোড অন্য কোথাও।
ভলকান রেভেন

4
সাধারণ কারেন্টডাইরেক্টরি আপনাকে জানায় না যে আপনার এক্সিকিউটেবলগুলি কোথায় থাকে। এটি এর জন্য ব্যবহৃত হয় না। এক্সিকিউটেবলগুলি একই স্থানে প্রায়শই ঘটে তাই অনেক প্রোগ্রামার পার্থক্য বুঝতে পারে না। তারপরে তারা শেষ ব্যবহারকারীদের জন্য সমস্যার সৃষ্টি করে যা প্রত্যাশাটি কারেন্টডাইরেক্টরির সঠিক ব্যবহার বুঝতে পারে understand
বেন্ট ট্রানবার্গ

5

আমি অবস্থানের পরিবর্তে এসেম্বলি.কোডবেস ব্যবহার করছি:

Assembly a;
a = Assembly.GetAssembly(typeof(DaoTests));
string s = a.CodeBase.ToUpper(); // file:///c:/path/name.dll
Assert.AreEqual(true, s.StartsWith("FILE://"), "CodeBase is " + s);
s = s.Substring(7, s.LastIndexOf('/') - 7); // 7 = "file://"
while (s.StartsWith("/")) {
    s = s.Substring(1, s.Length - 1);
}
s = s.Replace("/", "\\");

এটি কাজ করে চলেছে তবে আমি এটি আর 100% সঠিক কিনা তা নিশ্চিত no Http://blogs.msdn.com/suzcook/archive/2003/06/26/asorses-codebase-vs-asাস-- অবস্থান.এএসপিএক্স এর পৃষ্ঠাটি বলেছেন:

"কোডবেজ সেই জায়গার একটি URL যেখানে ফাইলটি পাওয়া গেছে, যেখানে অবস্থানটি সেই পথ যেখানে এটি আসলে লোড করা হয়েছিল example উদাহরণস্বরূপ, যদি সমাবেশটি ইন্টারনেট থেকে ডাউনলোড করা হয় তবে এর কোডবেস" http: // "দিয়ে শুরু হতে পারে , তবে এর অবস্থানটি "সি: \" দিয়ে শুরু হতে পারে the জিএসি-তে সমাবেশগুলির জন্য সেট করার জন্য set তবে ডিস্ক থেকে লোড হওয়া সমাবেশগুলির জন্য সর্বদা অবস্থান নির্ধারণ করা হবে ""

আপনি অবস্থানের পরিবর্তে কোডবেস ব্যবহার করতে চাইতে পারেন।


1
@ কিকিনেট: কেবলমাত্র একটি ইউআরআইকে একটি পথে রূপান্তর করার জন্য এতগুলি কোড। অবশ্যই এটি উন্নত করা যেতে পারে। মাইক শ্যাচের বা সোমোসের উত্তরটি দেখুন। আপনার স্ট্রিং স্তরে ইউআরআই রূপান্তর করার চেষ্টা করা উচিত নয়, পরিবর্তে উপযুক্ত অবজেক্টগুলি ব্যবহার করুন। ঠিক আছে, এটি আনাড়িও বটে যে সমাবেশ Assembly কোডবেস ইউআরআই বা ফাইলআইএনফো এর মতো আরও উপযুক্ত অবজেক্টের পরিবর্তে একটি স্ট্রিং প্রদান করে।
সাত


2

প্রস্তাবিত সমস্ত উত্তর কাজ করে যখন বিকাশকারী প্রয়োজনীয় স্নিপেট অন্তর্ভুক্ত করার জন্য কোড পরিবর্তন করতে পারে, তবে আপনি যদি কোনও কোড পরিবর্তন না করে এটি করতে চান তবে আপনি প্রক্রিয়া এক্সপ্লোরার ব্যবহার করতে পারেন।

এটি সিস্টেমে সমস্ত নির্বাহী ঘরের তালিকা তৈরি করবে, আপনার চলমান অ্যাপ্লিকেশনটির প্রসেস আইডি নির্ধারণ করতে আপনার প্রয়োজন হতে পারে, তবে এটি সাধারণত খুব কঠিন নয়।

আমি II এর অভ্যন্তরে কীভাবে এটি করতে পারি তার সম্পূর্ণ বিবরণ লিখেছি - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executes-dll-on-a-running-web -server /


নোট করুন যে সবার আগে, নিবন্ধের কোডটি মোটামুটি আইআইএস-কেন্দ্রিক এবং দ্বিতীয়, এটি আপনাকে (আমি বিশ্বাস করি) বর্তমানে সমস্ত লোডড ডেল দেয় যা কোনও এক সময়ে চলছে not
জর্জ মাউয়ার

প্রদত্ত উদাহরণটি আইআইএস সম্পর্কিত, তবে dll আইআইএসের বাইরে কোনও প্রক্রিয়াতে চলতে থাকলে একই পদক্ষেপগুলি প্রযোজ্য। এটি প্রক্রিয়া আইডি সনাক্তকরণের বিষয়। আমি এটি নিবন্ধটি আপডেট করব। পরামর্শের জন্য ধন্যবাদ.
ব্রায়ান

2

উইন্ডোজ ফর্ম অ্যাপ্লিকেশনটিতে, আপনি কেবল ব্যবহার করতে পারেন Application.StartupPath

তবে ডিএলএল এবং কনসোল অ্যাপসের জন্য কোডটি মনে রাখা খুব কঠিন ...

string slash = Path.DirectorySeparatorChar.ToString();
string root = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

root += slash;
string settingsIni = root + "settings.ini"


1

কোনও পাথে '#' চিহ্ন থাকলে আপনি ভুল ডিরেক্টরি পাবেন। সুতরাং আমি জন সাবেলি উত্তরের একটি পরিবর্তন ব্যবহার করি যা ইউরিবিল্ডার Pপাথ এবং ইউরিবিল্ডার সমন্বয় ra ফ্রেগমেন্ট:

public static string AssemblyDirectory
{
    get
    {
        string codeBase = Assembly.GetExecutingAssembly().CodeBase;
        UriBuilder uri = new UriBuilder(codeBase);
        //modification of the John Sibly answer    
        string path = Uri.UnescapeDataString(uri.Path.Replace("/", "\\") + 
          uri.Fragment.Replace("/", "\\"));
        return Path.GetDirectoryName(path);
     }
}

0

এটিই আমি নিয়ে এসেছি। ওয়েব প্রকল্পগুলির মধ্যে, ইউনিট পরীক্ষাগুলি (নুনিট এবং পুনরায় ভাগ করা পরীক্ষা চালক) ; আমি এটি আমার জন্য কাজ পেয়েছি।

বিল্ডটি কী কনফিগারেশনে রয়েছে তা সনাক্ত করার জন্য আমি কোডের সন্ধান করছি Debug/Release/CustomName। হায়রে, #if DEBUGসুতরাং কেউ যদি তা উন্নতি করতে পারে !

সম্পাদনা এবং উন্নত নির্দ্বিধায়।

অ্যাপ ফোল্ডার পাচ্ছেন । পরীক্ষার ফাইলগুলির ফোল্ডারটি পেতে ওয়েব শিকড়, ইউনিটসেটের জন্য দরকারী।

public static string AppPath
{
    get
    {
        DirectoryInfo appPath = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory);

        while (appPath.FullName.Contains(@"\bin\", StringComparison.CurrentCultureIgnoreCase)
                || appPath.FullName.EndsWith(@"\bin", StringComparison.CurrentCultureIgnoreCase))
        {
            appPath = appPath.Parent;
        }
        return appPath.FullName;
    }
}

বিন ফোল্ডারটি পাওয়া : প্রতিবিম্ব ব্যবহার করে সমাবেশগুলি কার্যকর করার জন্য দরকারী uting বিল্ড প্রোপার্টিগুলির কারণে যদি ফাইলগুলি এখানে অনুলিপি করা হয়।

public static string BinPath
{
    get
    {
        string binPath = AppDomain.CurrentDomain.BaseDirectory;

        if (!binPath.Contains(@"\bin\", StringComparison.CurrentCultureIgnoreCase)
            && !binPath.EndsWith(@"\bin", StringComparison.CurrentCultureIgnoreCase))
        {
            binPath = Path.Combine(binPath, "bin");
            //-- Please improve this if there is a better way
            //-- Also note that apps like webapps do not have a debug or release folder. So we would just return bin.
#if DEBUG
            if (Directory.Exists(Path.Combine(binPath, "Debug"))) 
                        binPath = Path.Combine(binPath, "Debug");
#else
            if (Directory.Exists(Path.Combine(binPath, "Release"))) 
                        binPath = Path.Combine(binPath, "Release");
#endif
        }
            return binPath;
    }
}

0

এই কাজ করা উচিত:

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
Assembly asm = Assembly.GetCallingAssembly();
String path = Path.GetDirectoryName(new Uri(asm.EscapedCodeBase).LocalPath);

string strLog4NetConfigPath = System.IO.Path.Combine(path, "log4net.config");

আমি কিছু কনফিগারেশন ফাইলের সাথে এটি ডিএলএল ফাইল লাইব্রেরি স্থাপন করতে ব্যবহার করছি (এটি ডিএলএল ফাইলের মধ্যে থেকে লগ 4 নেট ব্যবহার করা হয়)।


fileMapএখানে কি ব্যবহার করা হয়?
জর্জ মাউয়ার

0

আমি স্থানটি পুনরুদ্ধারের জন্য আমার সমাধানটিকে পর্যাপ্ত মনে করি।

var executingAssembly = new FileInfo((Assembly.GetExecutingAssembly().Location)).Directory.FullName;

ইতিমধ্যে উপরের বিপরিতে উত্তর অন্যতম এবং কিছু যে এই অবস্থায় কাজ না করে প্রশ্নে স্পষ্টভাবে উল্লেখ করা হয়।
জর্জ মাউয়ার

ক্ষমা চেয়েছেন যে মিস করতে হবে! অবশ্যই আমি পুরোপুরি পড়া হয়নি।
তেজ উইংফিল্ড

0

আমি NUnitঅতীতে একই আচরণ পেয়েছিলাম । ডিফল্টরূপে NUnitঅ্যাসেম্বলিটি অস্থায়ী ডিরেক্টরিতে অনুলিপি করে। আপনি NUnitসেটিংসে এই আচরণটি পরিবর্তন করতে পারেন :

এখানে চিত্র বর্ণনা লিখুন

হতে পারে TestDriven.NETএবং MbUnitজিইউআইয়ের একই সেটিংস রয়েছে।


-3

আমি বিন ডিরেক্টরিতে যাওয়ার পথটি পেতে এটি ব্যবহার করি:

var i = Environment.CurrentDirectory.LastIndexOf(@"\");
var path = Environment.CurrentDirectory.Substring(0,i); 

আপনি এই ফলাফল পেতে:

"সি: \ ব্যবহারকারী \ রিকুলি \ দস্তাবেজগুলি \ ভিজ্যুয়াল স্টুডিও 2010 \ প্রকল্পগুলি \ উইন্ডোজ_স্টেস্ট_প্রজেক্ট \ উইন্ডোজ_স্টেস্ট_প্রজেক্ট \ বিন"


6
আমি এখানে পাথ.ডেট ডিরেক্টরি ডিরেক্টরি এড়াতে কোনও কারণ দেখতে পাচ্ছি না
ম্যাক্স কেলার

@ ম্যাক্সকেলার আপনি যদি কারণগুলি না দেখেন তবে এর অর্থ এই নয় যে এটি সঠিক। পথের এই বিকল্প পদ্ধতি etGETDirectoryName দশগুণ দ্রুত।
রুসলান ভেসেলভ

-3

ওয়েব অ্যাপ্লিকেশন?

Server.MapPath("~/MyDir/MyFile.ext")

2
@ ক্রিশ্দিয়ান্ডেভ এটি একটি উত্তর তবে এটি সম্ভবত ভুল প্রশ্নের উত্তর বলে মনে হচ্ছে। প্রশ্নটি থেকে এটি সম্পূর্ণ পরিষ্কার যে এটি কোনও ওয়েব অ্যাপ্লিকেশন নয় বরং এমবিউনিতের দ্বারা পরিচালিত একটি অ্যাসেম্বলি। বলা হচ্ছে, Asp.Net ছায়া অনুলিপি করার কারণে উত্তরটি এখনও সত্যিকার অর্থে সঠিক নয় (যদিও এই প্রশ্নটিতে অবতরণকারী কেউ কী খুঁজছেন তা অনুমেয় হতে পারে)।
জর্জ মাউয়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.