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 \ MbUnitSystem.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location
memberikan C: \ Documents and Settings \ george \ Local Settings \ Temp \ .... \ DaoTests.dllSystem.Reflection.Assembly.GetExecutingAssembly().Location
memberi sama seperti sebelumnya.
sumber
packages
sebelah 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.Jawaban:
Saya telah mendefinisikan properti berikut karena kami sering menggunakannya dalam pengujian unit.
The
Assembly.Location
properti kadang-kadang memberi Anda beberapa hasil lucu ketika menggunakan NUnit (di mana majelis dijalankan dari folder sementara), jadi saya lebih memilih untuk menggunakanCodeBase
yang memberi Anda jalan dalam format URI, makaUriBuild.UnescapeDataString
menghapusFile://
di awal, danGetDirectoryName
perubahan ke format jendela yang normal .sumber
Apakah ini membantu?
sumber
typeof(DaoTests).Assembly
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.Sesederhana ini:
sumber
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
.AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory
Sama seperti jawaban John, tetapi metode ekstensi sedikit kurang verbose.
Sekarang Anda bisa melakukannya:
atau jika Anda lebih suka:
sumber
assembly
bukanAssembly.GetExecutingAssembly()
?Satu-satunya solusi yang bekerja untuk saya ketika menggunakan CodeBase dan saham UNC Network adalah:
Ini juga berfungsi dengan URI normal juga.
sumber
GetExecutingAssembly()
denganGetCallingAssembly()
.AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory
. Bagian pertama adalah untuk aplikasi web, dan yang kedua untuk aplikasi lain.Ini akan berfungsi, kecuali jika rakitannya disalin bayangan :
sumber
Bagaimana dengan ini:
sumber
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?
sumber
Assembly.CodeBase
.bekerja dengan GUI MbUnit.
sumber
Saya percaya ini akan bekerja untuk semua jenis aplikasi:
sumber
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 dijalankan
CodeBase
properti .Ini mengembalikan URL (
file://
). Alih-alih bermain-main dengan manipulasi string atauUnescapeDataString
, ini dapat dikonversi dengan keributan minimal dengan memanfaatkanLocalPath
propertiUri
.sumber
#
(EscapedCodeBase
berfungsi, tetapi EscapedCodeBase tidak berfungsi jika path berisi misalnya%20
kata demi kata (yang merupakan urutan karakter yang diizinkan dalam jalur Windows)GetExecutingAssembly()
denganGetCallingAssembly()
.Bagaimana dengan ini ...
Maka cukup hack apa yang tidak Anda butuhkan
sumber
sumber
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.
sumber
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
sumber
Direktori saat ini di mana Anda berada.
Jika Anda menyalin file .xml dengan build, Anda harus menemukannya.
atau
sumber
Environment.CurrentDirectory
berfungsi jika Anda menggunakan refleksi di kelas tugas MSBuild, di mana majelis pelaksana berada di GAC dan kode Anda berada di tempat lain.Saya telah menggunakan Assembly.CodeBase alih-alih Lokasi:
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.
sumber
Anda bisa mendapatkan path bin dengan AppDomain.CurrentDomain.RelativeSearchPath
sumber
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 /
sumber
di aplikasi formulir windows, Anda cukup menggunakan
Application.StartupPath
tetapi untuk DLL dan aplikasi konsol, kode ini jauh lebih sulit untuk diingat ...
sumber
sumber
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:
sumber
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.
Mendapatkan folder bin : Berguna untuk menjalankan rakitan menggunakan refleksi. Jika file disalin di sana karena membangun properti.
sumber
Ini seharusnya bekerja:
Saya menggunakan ini untuk menggunakan pustaka file DLL bersama dengan beberapa file konfigurasi (ini menggunakan log4net dari dalam file DLL).
sumber
fileMap
digunakan di sini?Saya menemukan solusi saya memadai untuk pengambilan lokasi.
sumber
Saya memiliki perilaku yang sama
NUnit
di masa lalu. Secara defaultNUnit
menyalin perakitan Anda ke direktori temp. Anda dapat mengubah perilaku ini diNUnit
pengaturan:Mungkin
TestDriven.NET
danMbUnit
GUI memiliki pengaturan yang sama.sumber
Saya menggunakan ini untuk mendapatkan path ke Direktori Bin:
Anda mendapatkan hasil ini:
sumber
Aplikasi web?
sumber