Bagaimana cara mendapatkan jalur perakitan kode ini?

782

Apakah ada cara untuk mendapatkan jalur untuk perakitan tempat kode saat ini berada? Saya tidak ingin jalur majelis panggilan, hanya yang berisi kode.

Pada dasarnya tes unit saya perlu membaca beberapa file uji xml yang terletak relatif terhadap dll. Saya ingin path untuk selalu menyelesaikan dengan benar terlepas dari apakah pengujian dll dijalankan dari TestDriven.NET, GUI MbUnit atau sesuatu yang lain.

Sunting : Orang-orang tampaknya salah memahami apa yang saya minta.

Pustaka pengujian saya terletak di say

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

dan saya ingin mendapatkan jalur ini:

C: \ project \ myapplication \ daotests \ bin \ Debug \

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

  • Environment.CurrentDirectory memberikan c: \ Program Files \ MbUnit

  • System.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location memberikan C: \ Documents and Settings \ george \ Local Settings \ Temp \ .... \ DaoTests.dll

  • System.Reflection.Assembly.GetExecutingAssembly().Location memberi sama seperti sebelumnya.

George Mauer
sumber
102
Ini adalah solusi Anda: var dir = AppDomain.CurrentDomain.BaseDirectory;
Jalal El-Shaer
7
Ini harus menjadi solusi yang diterima. AppDomain.CurrentDomain.BaseDirectory adalah pendekatan yang benar.
aBetterGamer
2
Saya datang ke sini mencari solusi untuk paket nuget untuk membaca file JSON dari direktori pacakge-nya. Tampaknya ketika paket nuget dijalankan, "AppDomain.CurrentDomain.BaseDirectory" menunjuk ke direktori proyek yang sedang berjalan, dan bukan direktori paket nuget. Tidak satu pun dari ini tampaknya menargetkan direktori paket nuget dengan benar.
Lucas
@Lucas tidak, itu tidak akan terjadi karena bukan itu pertanyaan ini (bahkan ketika ditanya, nuget tidak ada) - jangan ragu untuk memulai pertanyaan baru dan ping saya di sana, tetapi saya dapat memberitahu Anda sekarang bahwa itu tidak mungkin dalam banyak kasus. Untuk sebagian besar proyek direktori nuget berada di packagessebelah file sln. TETAPI ketika Anda mengkompilasi dan mendistribusikan hal-hal tidak ada file sln dan direktori paket. Selama kompilasi, hal-hal yang diperlukan (tetapi tidak semuanya) disalin ke direktori bin. Taruhan terbaik Anda adalah menggunakan skrip postbuild untuk menyalin file yang Anda inginkan.
George Mauer

Jawaban:

1037

Saya telah mendefinisikan properti berikut karena kami sering menggunakannya dalam pengujian unit.

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 Assembly.Locationproperti kadang-kadang memberi Anda beberapa hasil lucu ketika menggunakan NUnit (di mana majelis dijalankan dari folder sementara), jadi saya lebih memilih untuk menggunakan CodeBaseyang memberi Anda jalan dalam format URI, maka UriBuild.UnescapeDataStringmenghapus File://di awal, dan GetDirectoryNameperubahan ke format jendela yang normal .

John Sibly
sumber
29
Ini memiliki satu masalah yang saya temui, jika nama direktori Anda adalah: c: \ My% 20Directory maka Uri.UnescapeDataString akan kembali: c: \ My Directory Ini berarti File.Exists ("c: \ My Directory \ MyFile.txt ") akan mengembalikan false karena jalur yang benar sebenarnya" c: \ My% 20Directory \ MyFile.txt "Saya menemukan ini karena jalur SVN kami memiliki spasi di dalamnya dan ketika kami memeriksanya, itu mengkodekan spasi.
row1
5
Hati-hati ketika Anda menggunakan ini untuk memeriksa File.Exist () karena metode ini akan mengembalikan false di jalur UNC. Gunakan jawaban @ Keith sebagai gantinya.
AZ.
3
Tidak tahu Anda bisa membuat statis sebelum publik. Senang tahu dan saya pikir saya lebih suka untuk dibaca
Valamas
5
Catatan: ini tidak berfungsi dengan lokasi jaringan (mis. \\ REMOT_EPC \ Folder)
Muxa
5
Juga ini tidak akan berfungsi jika direktori memiliki tanda nomor '#' di dalamnya. Tanda-tanda nomor diizinkan dalam direktori dan nama file di Windows.
Huemac
322

Apakah 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 );
Keith
sumber
lihat hasil edit saya, tidak, apakah ini sesuatu yang aneh tentang bagaimana MbUnit melakukan sesuatu?
George Mauer
3
Atur file xml menjadi konten, disalin dengan dll, atau sumber daya, baca dari dll.
Keith
22
Atau hanyatypeof(DaoTests).Assembly
SLaks
4
@SLaks @JohnySkovdal @Keith: Hai teman-teman, gunakan Assembly.GetExecutingAssembly(). Itu "mendapat majelis yang berisi kode yang sedang dieksekusi" (dari deskripsi metode). Saya menggunakan ini di AddIn " EntitiesToDTOs " saya. Lihat AssemblyHelper.cs untuk contoh nyata.
kzfabi
4
Punya masalah dengan posting oleh @John Silby, karena sepertinya tidak berfungsi untuk jalur UNC ... misalnya \\ Server \ Folder \ File.ext. Yang ini berhasil. +1
Blueberry
312

Sesederhana ini:

var dir = AppDomain.CurrentDomain.BaseDirectory;
Jalal El-Shaer
sumber
11
Ini harus menjadi solusi yang diterima. AppDomain.CurrentDomain.BaseDirectory adalah pendekatan yang benar.
aBetterGamer
5
terima kasih telah mengembalikan perhatian saya pada hal ini - tidak yakin apakah itu tersedia pada saat saya mengajukan pertanyaan tetapi sekarang.
George Mauer
120
Tidak, ini salah. Ini mengembalikan jalur POINT MASUK ASLI bukan kode yang sedang dijalankan. Jika Anda telah memuat rakitan secara manual dari jalur yang berbeda, atau jika telah dimuat dari GAC, itu akan mengembalikan hasil yang salah. Jawaban ini benar: stackoverflow.com/a/283917/243557 Masih lebih cepat Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location).
nathanchere
9
Sebenarnya ini tidak akan berfungsi dalam aplikasi web tetapi sejauh yang saya temukan augmentasi berikut ini dapat digunakan untuk semua jenis aplikasi:AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory
Ilya Chernomordik
4
Ini sangat baik untuk pengujian unit jika Anda hanya ingin mendapatkan jalur bin asli dari unit pengujian Anda (misalnya, untuk mencapai file data tambahan dalam subfolder). Rakitan pengujian adalah titik masuk dari kode Anda.
MarioDS
68

Sama seperti jawaban John, tetapi metode ekstensi sedikit kurang verbose.

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

Sekarang Anda bisa melakukannya:

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

atau jika Anda lebih suka:

var localDir = typeof(DaoTests).Assembly.GetDirectoryPath();
Sneal
sumber
6
Apakah yang Anda maksudkan assemblybukan Assembly.GetExecutingAssembly()?
Dude Pascalou
3
Seperti yang ditunjukkan Bung, Anda menyampaikan argumen dan gagal menggunakannya.
Chris Moschini
4
Jawaban ini jelas keliru untuk pertanyaan yang ada. Versi modifikasi dari jawaban ini dapat memberi Anda jalur perakitan yang diberikan. Namun, di sini, kami secara khusus mencari majelis pelaksana, dan dengan demikian melewatinya tidak masuk akal. Metode ekstensi adalah alat yang salah untuk pekerjaan itu.
Edward Brey
46

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

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

Ini juga berfungsi dengan URI normal juga.

Ignacio Soler Garcia
sumber
5
Ini harus menjadi jawaban yang diterima. Sangat menyebalkan bahwa basis kode default tidak menangani saham UNC dengan benar.
Daniel Gilbert
Ini runtuh ketika folder berisi spasi dan dewa tahu apa karakter lain ...
MarioDS
1
Saya sudah sering menggunakan ini dan telah menemukan satu skenario di mana ia gagal: jika baris kode ini sendiri merupakan bagian dari paket NuGet yang kemudian digunakan oleh aplikasi! Kami juga dapat mendukung skenario itu dengan mengganti GetExecutingAssembly()dengan GetCallingAssembly().
Timo
@Timo: sudahkah Anda memverifikasi jika perubahan ini memiliki efek samping? Jika demikian, harap edit jawaban untuk menyertakan perbaikan.
Ignacio Soler Garcia
@IgnacioSolerGarcia Sayangnya saya harus melaporkan bahwa itu hanya bekerja satu lapisan dalam, yaitu gagal jika paket NuGet dipanggil oleh paket NuGet lain! Saya sekarang menggunakan ini (dari komentar pada halaman ini dengan Chernomordik): AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory. Bagian pertama adalah untuk aplikasi web, dan yang kedua untuk aplikasi lain.
Timo
32

Ini akan berfungsi, kecuali jika rakitannya disalin bayangan :

string path = System.Reflection.Assembly.GetExecutingAssembly().Location
Jodonnell
sumber
14

Bagaimana dengan ini:

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

Saya menduga bahwa masalah sebenarnya di sini adalah bahwa pelari ujian Anda menyalin rakitan Anda ke lokasi yang berbeda. Tidak ada waktu saat runtime untuk mengetahui dari mana rakitan itu disalin, tetapi Anda mungkin dapat membalik saklar untuk memberi tahu pelari uji untuk menjalankan rakitan dari tempat itu dan tidak menyalinnya ke direktori bayangan.

Pergantian seperti itu kemungkinan akan berbeda untuk setiap pelari tes, tentu saja.

Sudahkah Anda mempertimbangkan untuk menanamkan data XML Anda sebagai sumber daya di dalam unit pengujian Anda?

Curt Hagenlocher
sumber
+1 untuk menunjukkan masalah dengan penyalinan bayangan. Namun, memang mungkin untuk menentukan tempat asli dari Assembly.CodeBase.
tm1
11
AppDomain.CurrentDomain.BaseDirectory

bekerja dengan GUI MbUnit.

pengguna368021
sumber
Ini bekerja sangat baik untuk menulis file relatif ke direktori root di aplikasi web asp.net
Philip Pittle
Saya telah menemukan bahwa ini bekerja paling baik secara umum. Pilih jika Anda tidak yakin.
Erik Bergstedt
10

Saya percaya ini akan bekerja untuk semua jenis aplikasi:

AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory
Ilya Chernomordik
sumber
1
Eksperimen saya menunjukkan ini sebagai jawaban yang paling mudah, tidak hanya mencakup aplikasi web dan konsol, tetapi juga panggilan dari unit test dan paket NuGet (disatukan ke tingkat rekursi apa pun).
Timo
8

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

Cara yang benar untuk melakukan ini untuk rakitan berbasis disk (sebagai lawan berbasis web), rakitan non-GAC adalah dengan menggunakan rakitan yang sedang dijalankanCodeBase properti .

Ini mengembalikan URL ( file://). Alih-alih bermain-main dengan manipulasi string atau UnescapeDataString, ini dapat dikonversi dengan keributan minimal dengan memanfaatkan LocalPathproperti Uri.

var codeBaseUrl = Assembly.GetExecutingAssembly().CodeBase;
var filePathToCodeBase = new Uri(codeBaseUrl).LocalPath;
var directoryPath = Path.GetDirectoryName(filePathToCodeBase);
pemboros
sumber
1
Tidak berfungsi jika path berisi #( EscapedCodeBaseberfungsi, tetapi EscapedCodeBase tidak berfungsi jika path berisi misalnya %20kata demi kata (yang merupakan urutan karakter yang diizinkan dalam jalur Windows)
Martin Ba
Jika kita ingin memiliki kode ini dalam paket NuGet, kita dapat memperbaiki skenario itu dengan mengganti GetExecutingAssembly()dengan GetCallingAssembly().
Timo
8

Bagaimana dengan ini ...

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

Maka cukup hack apa yang tidak Anda butuhkan

David C Fuchs
sumber
7
var assembly = System.Reflection.Assembly.GetExecutingAssembly();
var assemblyPath = assembly.GetFiles()[0].Name;
var assemblyDir = System.IO.Path.GetDirectoryName(assemblyPath);
Mark Cidade
sumber
7

Berikut ini adalah port VB.NET dari kode John Sibly. Visual Basic tidak peka huruf besar kecil, jadi beberapa nama variabelnya bertabrakan dengan nama tipe.

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
Mike Schall
sumber
6

Selama bertahun-tahun, tidak ada yang benar-benar menyebutkan ini. Trik yang saya pelajari dari proyek ApprovalTests yang luar biasa . Kuncinya adalah Anda menggunakan informasi debug di majelis untuk menemukan direktori asli.

Ini tidak akan berfungsi dalam mode RELEASE, atau dengan optimisasi diaktifkan, atau pada mesin yang berbeda dari yang dikompilasi.

Tapi ini akan memberi Anda jalur yang relatif ke lokasi file kode sumber dari mana Anda memanggilnya

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;
    }
}
George Mauer
sumber
5

Direktori saat ini di mana Anda berada.

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

Jika Anda menyalin file .xml dengan build, Anda harus menemukannya.

atau

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

// The location of the Assembly
assembly.Location;
David Basarab
sumber
ini akan bermasalah jika majelis telah disalin bayangan .
pemboros
+1520! Environment.CurrentDirectoryberfungsi jika Anda menggunakan refleksi di kelas tugas MSBuild, di mana majelis pelaksana berada di GAC dan kode Anda berada di tempat lain.
gagak vulcan
4
Secara umum, CurrentDirectory tidak memberi tahu Anda di mana file executable Anda berada. Bukan untuk apa itu digunakan. Itu kebetulan sering menjadi lokasi yang sama dengan executable, jadi banyak programmer tidak memahami perbedaannya. Kemudian mereka pada akhirnya menciptakan masalah bagi beberapa pengguna akhir yang mengharapkan aplikasi untuk memahami penggunaan CurrentDirectory dengan tepat.
Bent Tranberg
5

Saya telah menggunakan Assembly.CodeBase alih-alih 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("/", "\\");

Sudah bekerja, tapi saya 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 file itu ditemukan, sedangkan Lokasi adalah jalur di mana file itu sebenarnya dimuat. Misalnya, jika perakitan diunduh dari internet, CodeBase-nya mungkin dimulai dengan" http: // " , tetapi Lokasinya dapat dimulai dengan "C: \". Jika file itu disalin bayangan, Lokasi akan menjadi jalur ke salinan file dalam direktori salinan bayangan. Juga baik untuk mengetahui bahwa CodeBase tidak dijamin akan ditetapkan untuk rakitan di GAC. Namun, lokasi akan selalu ditetapkan untuk rakitan yang dimuat dari disk. "

Anda mungkin ingin menggunakan CodeBase alih-alih Lokasi.

dan Gibson
sumber
1
@ Kiquenet: Begitu banyak kode hanya untuk mengubah URI menjadi jalur. Tentu itu bisa diperbaiki. Lihatlah jawaban Mike Schall atau SoMoS. Anda seharusnya tidak mencoba mengonversi URI pada level string, tetapi menggunakan objek yang sesuai. OK, juga kikuk bahwa Assembly.CodeBase mengembalikan string daripada objek yang lebih cocok, seperti URI atau FileInfo.
Tujuh
2

Anda bisa mendapatkan path bin dengan AppDomain.CurrentDomain.RelativeSearchPath

jumlahkan
sumber
2

Semua jawaban yang diajukan bekerja ketika pengembang dapat mengubah kode untuk memasukkan potongan yang diperlukan, tetapi jika Anda ingin melakukan ini tanpa mengubah kode apa pun Anda bisa menggunakan Process Explorer.

Ini akan mencantumkan semua dll yang dieksekusi pada sistem, Anda mungkin perlu menentukan id proses aplikasi yang Anda jalankan, tetapi itu biasanya tidak terlalu sulit.

Saya telah menulis deskripsi lengkap tentang bagaimana melakukan ini untuk dll di dalam II - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web -server /

Bryan
sumber
Perhatikan bahwa pertama-tama, kode dalam artikel ini cukup IIS-sentris dan kedua, memberi Anda (saya percaya) semua dll saat ini dimuat , bukan apa yang berjalan pada satu waktu.
George Mauer
Contoh yang diberikan berkaitan dengan iis, tetapi langkah yang sama berlaku jika dll berjalan dalam proses di luar iis. Ini hanya masalah mengidentifikasi id proses. Saya akan memperbarui artikel untuk mencatat itu. Terima kasih untuk sarannya.
Bryan
2

di aplikasi formulir windows, Anda cukup menggunakan Application.StartupPath

tetapi untuk DLL dan aplikasi konsol, kode ini jauh lebih sulit untuk diingat ...

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

root += slash;
string settingsIni = root + "settings.ini"
Shane J
sumber
1
string path = Path.GetDirectoryName(typeof(DaoTests).Module.FullyQualifiedName);
Jesse C. Slicer
sumber
1

Anda akan mendapatkan direktori yang salah jika path berisi simbol '#'. Jadi saya menggunakan modifikasi dari jawaban John Sibly yaitu kombinasi UriBuilder.Path dan UriBuilder.Fragment:

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);
     }
}
Fedor Shihantsov
sumber
0

Inilah yang saya pikirkan. Di antara proyek web, unit test (nunit dan runner uji ulang) ; Saya menemukan ini bekerja untuk saya.

Saya telah mencari kode untuk mendeteksi konfigurasi apa yang ada dalam build Debug/Release/CustomName,. Sayangnya, itu #if DEBUG. Jadi, jika seseorang dapat memperbaikinya !

Merasa bebas untuk mengedit dan meningkatkan.

Mendapatkan folder aplikasi . Berguna untuk root web, tidak tertarik untuk mendapatkan folder file uji.

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

Mendapatkan folder bin : Berguna untuk menjalankan rakitan menggunakan refleksi. Jika file disalin di sana karena membangun properti.

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;
    }
}
Valamas
sumber
0

Ini seharusnya bekerja:

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

Saya menggunakan ini untuk menggunakan pustaka file DLL bersama dengan beberapa file konfigurasi (ini menggunakan log4net dari dalam file DLL).

mmmmmm
sumber
Apa yang fileMapdigunakan di sini?
George Mauer
0

Saya menemukan solusi saya memadai untuk pengambilan lokasi.

var executingAssembly = new FileInfo((Assembly.GetExecutingAssembly().Location)).Directory.FullName;
Tez Wingfield
sumber
Ini sudah menjadi salah satu jawaban berperingkat teratas dan disebutkan secara eksplisit dalam pertanyaan sebagai sesuatu yang tidak berfungsi dalam situasi ini.
George Mauer
Permintaan maaf pasti sudah terlewatkan! Jelas saya tidak membaca dengan seksama.
Tez Wingfield
0

Saya memiliki perilaku yang sama NUnitdi masa lalu. Secara default NUnitmenyalin perakitan Anda ke direktori temp. Anda dapat mengubah perilaku ini di NUnitpengaturan:

masukkan deskripsi gambar di sini

Mungkin TestDriven.NETdan MbUnitGUI memiliki pengaturan yang sama.

Andrey Bushman
sumber
-3

Saya menggunakan ini untuk mendapatkan path ke Direktori Bin:

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

Anda mendapatkan hasil ini:

"c: \ users \ ricooley \ document \ visual studio 2010 \ Projects \ Windows_Test_Project \ Windows_Test_Project \ bin"

rcooley56
sumber
6
Saya tidak melihat alasan untuk menghindari Path.getDirectoryName di sini
Max Keller
@ MaxKeller Jika Anda tidak melihat alasan, itu tidak berarti bahwa itu benar. Metode alternatif Path.GetDirectoryName ini sepuluh kali lebih cepat.
Ruslan Veselov
-3

Aplikasi web?

Server.MapPath("~/MyDir/MyFile.ext")
pengguna2009677
sumber
2
@christiandev ini adalah jawaban, tetapi mungkin itu jawaban untuk pertanyaan yang salah. Dari pertanyaan itu cukup jelas bahwa ini bukan aplikasi web tetapi perakitan yang dijalankan dengan MbUnit. Yang sedang berkata, jawabannya masih belum benar-benar benar karena menyalin bayangan Asp.Net (meskipun bisa jadi apa yang dicari seseorang dari pertanyaan ini).
George Mauer