¿Hay alguna manera de obtener la ruta para el ensamblado en el que reside el código actual? No quiero la ruta del ensamblado de llamada, solo la que contiene el código.
Básicamente, mi prueba unitaria necesita leer algunos archivos de prueba xml que se encuentran en relación con el dll. Quiero que la ruta siempre se resuelva correctamente, independientemente de si el dll de prueba se ejecuta desde TestDriven.NET, la GUI MbUnit u otra cosa.
Editar : La gente parece estar malentendiendo lo que estoy preguntando.
Mi biblioteca de prueba está ubicada en say
C: \ projects \ myapplication \ daotests \ bin \ Debug \ daotests.dll
y me gustaría obtener este camino:
C: \ projects \ myapplication \ daotests \ bin \ Debug \
Las tres sugerencias hasta ahora me fallan cuando corro desde MbUnit Gui:
Environment.CurrentDirectory
da c: \ Archivos de programa \ MbUnitSystem.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location
da C: \ Documents and Settings \ george \ Local Settings \ Temp \ .... \ DaoTests.dllSystem.Reflection.Assembly.GetExecutingAssembly().Location
da lo mismo que el anterior.
fuente
packages
lado del archivo sln. PERO cuando compila y distribuye cosas, no hay archivos sln ni directorios de paquetes. Durante la compilación, las cosas que se necesitan (pero no todo) se copian en el directorio bin. Su mejor opción es utilizar una secuencia de comandos posterior a la creación para copiar el archivo que desee.Respuestas:
He definido la siguiente propiedad ya que la usamos a menudo en pruebas unitarias.
La
Assembly.Location
propiedad a veces le da algunos resultados divertidos cuando usa NUnit (donde los ensamblajes se ejecutan desde una carpeta temporal), por lo que prefiero usar elCodeBase
que le da la ruta en formato URI, luegoUriBuild.UnescapeDataString
elimina elFile://
al principio y loGetDirectoryName
cambia al formato normal de Windows .fuente
¿Esto ayuda?
fuente
typeof(DaoTests).Assembly
Assembly.GetExecutingAssembly()
. Es "recibe el ensamblado que contiene el código que se ejecuta actualmente" (a partir de la descripción del método). Lo uso en mi complemento " EntitiesToDTOs ". Ver AssemblyHelper.cs para un ejemplo real.Es tan simple como esto:
fuente
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
.AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory
Igual que la respuesta de John, pero un método de extensión un poco menos detallado.
Ahora puedes hacer:
o si lo prefieres:
fuente
assembly
lugar deAssembly.GetExecutingAssembly()
?La única solución que me funcionó al usar CodeBase y los recursos compartidos de la red UNC fue:
También funciona con URI normales también.
fuente
GetExecutingAssembly()
porGetCallingAssembly()
.AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory
. La primera parte es para aplicaciones web y la segunda para otras aplicaciones.Esto debería funcionar, a menos que el ensamblaje se copie de forma oculta :
fuente
¿Qué hay de esto?
fuente
Sospecho que el problema real aquí es que su corredor de prueba está copiando su ensamblaje en una ubicación diferente. No hay forma en el tiempo de ejecución de saber de dónde se copió el ensamblaje, pero probablemente pueda accionar un interruptor para decirle al corredor de prueba que ejecute el ensamblaje desde donde está y que no lo copie en un directorio oculto.
Es probable que dicho cambio sea diferente para cada corredor de prueba, por supuesto.
¿Ha considerado incrustar sus datos XML como recursos dentro de su ensamblaje de prueba?
fuente
Assembly.CodeBase
.funciona con MbUnit GUI.
fuente
Creo que esto funcionaría para cualquier tipo de aplicación:
fuente
Por lo que puedo decir, la mayoría de las otras respuestas tienen algunos problemas.
La forma correcta de hacer esto para un ensamblado no GACed basado en disco (en lugar de basado en web) es utilizar el ensamblado que se está ejecutando actualmente
CodeBase
propiedad .Esto devuelve una URL (
file://
). En lugar de perder el tiempo con la manipulación de cadenas oUnescapeDataString
, esto se puede convertir con un mínimo de alboroto aprovechando laLocalPath
propiedad deUri
.fuente
#
(EscapedCodeBase
funciona, pero EscapedCodeBase no funciona si la ruta contiene, por ejemplo,%20
textualmente (que es una secuencia de caracteres permitida en una ruta de Windows)GetExecutingAssembly()
porGetCallingAssembly()
.Qué tal esto ...
Luego simplemente corta lo que no necesitas
fuente
fuente
Aquí hay un puerto VB.NET del código de John Sibly. Visual Basic no distingue entre mayúsculas y minúsculas, por lo que un par de sus nombres de variables colisionaron con los nombres de tipo.
fuente
En todos estos años, nadie ha mencionado este. Un truco que aprendí del impresionante proyecto ApprovalTests . El truco es que usa la información de depuración en el ensamblado para encontrar el directorio original.
Esto no funcionará en modo RELEASE, ni con optimizaciones habilitadas, ni en una máquina diferente de la que fue compilada.
Pero esto le dará rutas relacionadas con la ubicación del archivo de código fuente desde el que lo llama
fuente
El directorio actual donde existes.
Si copia el archivo .xml con build, debería encontrarlo.
o
fuente
Environment.CurrentDirectory
funciona si está utilizando la reflexión en la clase de tarea MSBuild, donde el ensamblado en ejecución reside en GAC y su código está en otro lugar.He estado usando Assembly.CodeBase en lugar de Location:
Ha estado funcionando, pero ya no estoy seguro de que sea 100% correcto. La página en http://blogs.msdn.com/suzcook/archive/2003/06/26/assembly-codebase-vs-assembly-location.aspx dice:
"CodeBase es una URL del lugar donde se encontró el archivo, mientras que la ubicación es la ruta donde realmente se cargó. Por ejemplo, si el ensamblado se descargó de Internet, su CodeBase puede comenzar con" http: // " , pero su ubicación puede comenzar con "C: \". Si el archivo se ha copiado en la sombra, la ubicación sería la ruta a la copia del archivo en el directorio de copia de la sombra. También es bueno saber que CodeBase no está garantizado Sin embargo, la ubicación siempre se establecerá para los ensamblados cargados desde el disco. "
Es posible que desee utilizar CodeBase en lugar de Ubicación.
fuente
Puede obtener la ruta bin por AppDomain.CurrentDomain.RelativeSearchPath
fuente
Todas las respuestas propuestas funcionan cuando el desarrollador puede cambiar el código para incluir el fragmento requerido, pero si desea hacerlo sin cambiar ningún código, puede usar Process Explorer.
Enumerará todos los dlls en ejecución en el sistema, es posible que deba determinar la identificación del proceso de su aplicación en ejecución, pero eso generalmente no es demasiado difícil.
He escrito una descripción completa de cómo hacer esto para un dll dentro de II - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web -servidor/
fuente
en una aplicación de formulario de Windows, simplemente puede usar
Application.StartupPath
pero para las DLL y las aplicaciones de consola, el código es mucho más difícil de recordar ...
fuente
fuente
Obtendrá un directorio incorrecto si una ruta contiene el símbolo '#'. Entonces uso una modificación de la respuesta de John Sibly que es la combinación UriBuilder.Path y UriBuilder.Fragment:
fuente
Esto es lo que se me ocurrió. Entre proyectos web, pruebas unitarias (nunit y runner test runner) ; Encontré que esto funcionó para mí.
He estado buscando código para detectar qué configuración es la acumulación en,
Debug/Release/CustomName
. Por desgracia, el#if DEBUG
. Entonces, si alguien puede mejorar eso !Siéntase libre de editar y mejorar.
Obteniendo la carpeta de la aplicación . Útil para raíces web, pruebas unitarias para obtener la carpeta de archivos de prueba.
Cómo obtener la carpeta bin : útil para ejecutar ensamblajes usando la reflexión. Si los archivos se copian allí debido a las propiedades de compilación.
fuente
Esto debería funcionar:
Estoy usando esto para implementar bibliotecas de archivos DLL junto con algún archivo de configuración (esto es para usar log4net desde dentro del archivo DLL).
fuente
fileMap
usa aquí?Encuentro mi solución adecuada para la recuperación de la ubicación.
fuente
Obtuve el mismo comportamiento
NUnit
en el pasado. Por defectoNUnit
copia su ensamblaje en el directorio temporal. Puede cambiar este comportamiento en laNUnit
configuración:Quizás
TestDriven.NET
yMbUnit
GUI tienen la misma configuración.fuente
Lo uso para obtener la ruta al directorio Bin:
Obtienes este resultado:
fuente
¿Aplicación web?
fuente