Bagaimana cara mendapatkan jalur perakitan kode ini di?

Apakah ada cara untuk mendapatkan jalan untuk perakitan di mana kode saat ini berada? Aku tidak ingin jalan dari panggilan majelis, hanya satu yang berisi kode.

Pada dasarnya unit saya test perlu membaca beberapa xml file tes yang terletak relatif dll. Aku ingin jalan untuk selalu menyelesaikan dengan benar terlepas dari apakah pengujian dll lari dari TestDriven.NET, yang MbUnit GUI atau sesuatu yang lain.

Edit: sepertinya orang-Orang akan salah paham apa yang saya'm bertanya.

Saya tes perpustakaan ini terletak di katakan

C:\projects\myapplication\daotests\bin\Debug\daotests.dll

dan saya ingin mendapatkan jalan ini:

C:\projects\myapplication\daotests\bin\Debug\

Tiga saran sejauh ini gagal saya ketika saya lari dari MbUnit Gui:

  • Lingkungan.CurrentDirectory memberikan c:\Program File\MbUnit

  • Sistem.Refleksi.Perakitan.GetAssembly(typeof(DaoTests)).Lokasi memberikan C:\Documents dan Settings\george\Local Settings\Temp\ ....\DaoTests.dll

  • Sistem.Refleksi.Perakitan.GetExecutingAssembly().Lokasi memberikan yang sama seperti sebelumnya.

Mengomentari pertanyaan (6)
Larutan

I've didefinisikan sebagai berikut properti yang kita gunakan ini sering di unit pengujian.

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

The Perakitan.Lokasi properti kadang-kadang memberi anda beberapa hasil yang lucu ketika menggunakan NUnit (di mana majelis dijalankan dari folder sementara), jadi saya lebih memilih untuk menggunakanKodeyang memberikan anda jalan di format URI, makaUriBuild.UnescapeDataStringmenghilangkanFile://di awal, danGetDirectoryName` perubahan itu normal format windows.

Komentar (17)

Hal ini membantu?

//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 );
Komentar (12)

It's sederhana seperti ini:

var dir = AppDomain.CurrentDomain.BaseDirectory;
Komentar (9)

Sama seperti John's jawaban, tapi sedikit kurang verbose metode penyuluhan.

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

Sekarang anda dapat melakukan:

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

atau jika anda lebih suka:

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

Satu-satunya solusi yang bekerja untuk saya ketika menggunakan CodeBase dan UNC saham Jaringan adalah:

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

Ia juga bekerja dengan normal Uri juga.

Komentar (6)

Ini harus bekerja, kecuali majelis shadow copied:

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

Bagaimana dengan ini:

System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
Komentar (0)
AppDomain.CurrentDomain.BaseDirectory

bekerja dengan MbUnit GUI.

Komentar (2)

Saya menduga bahwa masalah sebenarnya di sini adalah bahwa anda menguji runner adalah menyalin perakitan anda ke lokasi yang berbeda. Ada's tidak ada cara pada saat runtime untuk memberitahu di mana majelis disalin dari, tetapi anda mungkin dapat flip switch untuk memberitahu tes runner untuk menjalankan perakitan dari tempat itu dan tidak salin ke bayangan direktori.

Seperti sebuah switch yang mungkin akan berbeda untuk masing-masing test runner, tentu saja.

Apakah anda dianggap embedding data XML sebagai sumber daya dalam perakitan tes?

Komentar (1)

Sejauh yang saya tahu, sebagian besar jawaban yang lain memiliki beberapa masalah.

Cara yang benar untuk melakukan hal ini untuk disk-based (sebagai lawan untuk web-based), non-GACed perakitan adalah digunakan saat ini pelaksana perakitan's Kode properti.

Ini kembali URL (file://). Bukan main-main dengan manipulasi string atau UnescapeDataString, hal ini dapat diubah dengan minimal rewel dengan memanfaatkan LocalPath milik Uri.

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

Berikut ini adalah VB.NET pelabuhan John Sibly's code. Visual Basic adalah tidak case sensitive, jadi beberapa dari nama-nama variabel yang bertabrakan dengan nama-nama jenis.

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
Komentar (1)
var assembly = System.Reflection.Assembly.GetExecutingAssembly();
var assemblyPath = assembly.GetFiles()[0].Name;
var assemblyDir = System.IO.Path.GetDirectoryName(assemblyPath);
Komentar (0)

Bagaimana tentang hal ini ...

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

Kemudian hanya hack dari apa yang anda tidak butuhkan

Komentar (0)

Dalam semua tahun-tahun ini, tak ada yang benar-benar telah disebutkan satu ini. Trik yang saya pelajari dari yang mengagumkan ApprovalTests project. Kuncinya adalah bahwa anda menggunakan informasi debugging di majelis untuk menemukan direktori asli.

Ini tidak akan bekerja dalam modus RILIS, atau dengan optimasi yang diaktifkan, atau pada mesin yang berbeda dari yang satu itu disusun di.

Tapi ini akan membuat anda di jalur yang relatif terhadap lokasi file kode sumber anda menyebutnya dari

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

Saat ini direktori di mana anda ada.

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

Jika anda menyalin .file xml dengan membangun anda harus menemukannya.

atau

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

// The location of the Assembly
assembly.Location;
Komentar (3)

I've telah menggunakan Perakitan.CodeBase bukan Lokasi:

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("/", "\\");

It's bekerja, tapi aku'm tidak lagi yakin itu 100% benar. Halaman di http://blogs.msdn.com/suzcook/archive/2003/06/26/assembly-codebase-vs-assembly-location.aspx mengatakan:

"CodeBase adalah URL ke tempat di mana file yang ditemukan, sedangkan Lokasi adalah jalan di mana itu benar-benar dimuat. Misalnya, jika majelis di-download dari internet, yang CodeBase mungkin mulai dengan "http://", tetapi pengunjung dapat memulai dengan "C:\". Jika file telah disalin bayangan, Lokasi yang akan menjadi jalan untuk copy file dalam bayangan copy dir. Hal ini juga baik untuk mengetahui bahwa Kode ini tidak dijamin akan ditetapkan untuk sidang di GAC. Lokasi akan selalu ditetapkan untuk sidang diambil dari disk, namun."

Anda may ingin menggunakan CodeBase bukan Lokasi.

Komentar (2)

Saya percaya ini akan bekerja untuk setiap jenis aplikasi:

AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory
Komentar (1)

Anda bisa mendapatkan bin jalan oleh AppDomain.CurrentDomain.RelativeSearchPath

Komentar (0)

dalam windows form aplikasi, anda hanya dapat menggunakan Aplikasi.StartupPath`

tapi untuk Dll dan aplikasi konsol kode jauh lebih sulit untuk mengingat...

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

root += slash;
string settingsIni = root + "settings.ini"
Komentar (0)

Semua jawaban yang diusulkan bekerja ketika pengembang dapat mengubah kode untuk memasukkan diperlukan cuplikan, tapi jika anda ingin melakukan hal ini tanpa mengubah kode anda bisa menggunakan Process Explorer.

Ini akan menampilkan semua pelaksana dll pada sistem, anda mungkin perlu untuk menentukan proses id anda menjalankan aplikasi, tapi itu biasanya tidak terlalu sulit.

I've tertulis keterangan lengkap tentang bagaimana melakukan ini untuk dll dalam II - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web-server/

Komentar (2)