Cum a face I a lua calea de asamblare codul este în?
Există o modalitate de a obține calea pentru adunarea în care actualul cod locuiește? Nu vreau calea sunat adunarea, doar unul care conține codul.
Practic, unitatea mea de test trebuie să citească unele xml fișierele de test, care sunt situate relativ dll. Vreau calea de a rezolva întotdeauna corect, indiferent dacă testarea dll este condus de TestDriven.NET, la MbUnit GUI sau altceva.
Edit: Oamenii par să nu înțelegi ce-am'm a întrebat.
Testul meu de bibliotecă este situat într-o spun
C:\projects\myapplication\daotests\bin\Debug\daotests.dll
și aș dori pentru a obține această cale:
C:\projects\myapplication\daotests\bin\Debug\
Trei sugestii, asa ca acum nu-mi atunci când am alerga de la MbUnit Gui:
-
Mediu.CurrentDirectory` dă c:\Program Files\MbUnit
-
Sistem.Reflecție.De asamblare.GetAssembly(typeof(DaoTests)).Locație dă C:\Documents și Settings\george\Local Settings\Temp\ ....\DaoTests.dll
-
Sistem.Reflecție.De asamblare.GetExecutingAssembly().Locație dă aceeași ca și cea anterioară.
Am'am definit următoarele proprietăți ca vom folosi acest lucru de multe ori în unitate de testare.
La Adunare.Location proprietatea uneori dă unele rezultate atunci când se utilizează NUnit (în cazul în care adunările alerga dintr-un folder temporar), așa că prefer să folosesc CodeBase
care dă drumul în format URI, apoi
UriBuild.UnescapeDataStringelimină
File:// la început, șiGetDirectoryName
modificări la windows normal format.Ajută asta?
L's la fel de simplu ca acest lucru:
Fel ca's a răspuns, dar un pic mai puțin detaliat metoda de extindere.
Acum puteți face:
sau, dacă preferați:
Singura soluție care a lucrat pentru mine atunci când se utilizează CodeBase și UNC acțiuni de Rețea a fost:
De asemenea, funcționează cu normal Uri prea.
Acest lucru ar trebui să funcționeze, cu excepția cazului în care adunarea este shadow copied:
Ce zici de asta:
funcționează cu MbUnit GUI.
Bănuiesc că adevărata problemă aici este că testul runner este copierea de asamblare într-o locație diferită. Nu's nici un fel la runtime pentru a spune unde ansamblul a fost copiat de la, dar, probabil, puteți apăsa un buton pentru a spune testul alergător pentru a rula ansamblul de unde este, și nu pentru a le copia la un shadow director.
Un astfel de comutator este probabil să fie diferite pentru fiecare test runner, desigur.
Te-ai gândit încorporarea de date XML ca resurse în interiorul tău test de asamblare?
În măsura în care eu pot spune, de cele mai multe alte răspunsuri au câteva probleme.
Modul corect de a face acest lucru pentru un bazat pe disc (spre deosebire de web-based), non-GACed de asamblare este de a utiliza de executare în prezent de asamblare's `CodeBase de proprietate.
Acesta returnează o adresă URL (
file://
). În loc de în jur de joc cu șir de manipulare sauUnescapeDataString
, acest lucru poate fi convertit cu un minim de tam-tam prin folosireaLocalPath
proprietateaUri
.Aici este o VB.NET portul de John Sibly's cod. Visual Basic nu este case sensitive, deci, câteva nume de variabile au fost coliziunea cu nume de tip.
Ce zici de asta ...
Apoi hack doar pe ce nu ai nevoie
În toți acești ani, nimeni nu a pomenit de asta. Un truc învățat de minunat ApprovalTests project. Trucul este să utilizați informații de depanare în ansamblul pentru a găsi directorul original.
Acest lucru nu va funcționa în modul de LANSARE, nici cu optimizări activat, nici pe o mașină diferită de cea pentru care au fost elaborate pe.
Dar acest lucru te va căi că sunt relativă la locația de fișier de cod sursă suni la
Directorul curent în cazul în care exiști.
Dacă copiați .fișier xml cu construiască ar trebui să-l găsească.
sau
Am'am fost folosind de Asamblare.CodeBase în loc de Amplasare:
L's a fost de lucru, dar am'm nu mai este sigur că acesta este de 100% corecte. Pagina de la http://blogs.msdn.com/suzcook/archive/2003/06/26/assembly-codebase-vs-assembly-location.aspx spune:
"CodeBase este un URL la locul în care fișierul a fost găsit, în timp ce Locația este calea unde a fost încărcată. De exemplu, dacă adunarea a fost descărcat de pe internet, sa CodeBase poate începe cu "http://", dar Locația sa poate începe cu "C:\". Dacă fișierul a fost umbra-copiate, Locația ar fi calea de a copia fișierul în shadow copy dir. Este, de asemenea, bine să știți că CodeBase nu este garantat de a fi setat pentru ansambluri în GAC. Locația va fi întotdeauna stabilită pentru adunările încărcate de pe disc, cu toate acestea."
Ai may doriți să utilizați CodeBase în loc de Locație.
Cred că acest lucru va lucra pentru orice tip de aplicație:
Puteți obține bin calea de AppDomain.CurrentDomain.RelativeSearchPath
într-un formular de windows app, puteți folosi pur și simplu de Aplicare.StartupPath`
dar pentru Dll-uri și console de aplicații codul este mult mai greu să-și amintească...
Toate răspunsurile propuse de muncă în cazul în care dezvoltatorul poate schimba codul de a include necesară fragment, dar dacă ai vrut să faci acest lucru fără a modifica orice cod ai putea folosi Process Explorer.
Aceasta va lista toate executare dll-uri pe sistem, ar putea fi necesar pentru a determina procesul de id-ul de aplicație care rulează, dar care este, de obicei, nu prea dificil.
Am'am scris o descriere completă a cum face acest lucru pentru un dll în interiorul II - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web-server/