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.
I've didefinisikan sebagai berikut properti yang kita gunakan ini sering di unit pengujian.
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 menggunakan
Kodeyang memberikan anda jalan di format URI, maka
UriBuild.UnescapeDataStringmenghilangkan
File://di awal, dan
GetDirectoryName` perubahan itu normal format windows.Hal ini membantu?
It's sederhana seperti ini:
Sama seperti John's jawaban, tapi sedikit kurang verbose metode penyuluhan.
Sekarang anda dapat melakukan:
atau jika anda lebih suka:
Satu-satunya solusi yang bekerja untuk saya ketika menggunakan CodeBase dan UNC saham Jaringan adalah:
Ia juga bekerja dengan normal Uri juga.
Ini harus bekerja, kecuali majelis shadow copied:
Bagaimana dengan ini:
bekerja dengan MbUnit GUI.
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?
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 atauUnescapeDataString
, hal ini dapat diubah dengan minimal rewel dengan memanfaatkanLocalPath
milikUri
.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.
Bagaimana tentang hal ini ...
Kemudian hanya hack dari apa yang anda tidak butuhkan
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
Saat ini direktori di mana anda ada.
Jika anda menyalin .file xml dengan membangun anda harus menemukannya.
atau
I've telah menggunakan Perakitan.CodeBase bukan Lokasi:
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.
Saya percaya ini akan bekerja untuk setiap jenis aplikasi:
Anda bisa mendapatkan bin jalan oleh AppDomain.CurrentDomain.RelativeSearchPath
dalam windows form aplikasi, anda hanya dapat menggunakan Aplikasi.StartupPath`
tapi untuk Dll dan aplikasi konsol kode jauh lebih sulit untuk mengingat...
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/