Existe uma maneira de obter o caminho para o assembly no qual o código atual reside? Eu não quero o caminho do assembly de chamada, apenas aquele que contém o código.
Basicamente, meu teste de unidade precisa ler alguns arquivos de teste xml que estão localizados em relação à dll. Quero que o caminho seja sempre resolvido corretamente, independentemente de a dll de teste ser executada no TestDriven.NET, na GUI do MbUnit ou em qualquer outra coisa.
Edit : As pessoas parecem estar entendendo mal o que estou perguntando.
Minha biblioteca de teste está localizada em digamos
C: \ projetos \ myapplication \ daotests \ bin \ Debug \ daotests.dll
e eu gostaria de pegar esse caminho:
C: \ projetos \ myapplication \ daotests \ bin \ Debug \
Até agora, as três sugestões falham quando executo o MbUnit Gui:
Environment.CurrentDirectory
fornece c: \ Arquivos de programas \ MbUnitSystem.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location
fornece C: \ Documents and Settings \ george \ Configurações locais \ Temp \ .... \ DaoTests.dllSystem.Reflection.Assembly.GetExecutingAssembly().Location
dá o mesmo que o anterior.
fonte
packages
ao lado do arquivo sln. Mas quando você compila e distribui coisas, não há arquivo sln nem diretório de pacotes. Durante a compilação, as coisas necessárias (mas não tudo) são copiadas no diretório bin. Sua melhor aposta é usar um script postbuild para copiar o arquivo que você deseja.Respostas:
Eu defini a propriedade a seguir, pois usamos isso frequentemente em testes de unidade.
A
Assembly.Location
propriedade, por vezes, dá-lhe alguns resultados engraçados quando usando NUnit (onde montagens executado a partir de uma pasta temporária), então eu prefiro usarCodeBase
o que lhe dá o caminho em formato URI, em seguida,UriBuild.UnescapeDataString
remove oFile://
no início, eGetDirectoryName
muda-lo para o formato de janelas normais .fonte
Isso ajuda?
fonte
typeof(DaoTests).Assembly
Assembly.GetExecutingAssembly()
. Ele "recebe o assembly que contém o código que está em execução" (da descrição do método). Eu uso isso no meu AddIn " EntitiesToDTOs ". Consulte AssemblyHelper.cs para obter um exemplo real.É simples assim:
fonte
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
.AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory
O mesmo que a resposta de John, mas um método de extensão um pouco menos detalhado.
Agora você pode fazer:
ou se você preferir:
fonte
assembly
vez deAssembly.GetExecutingAssembly()
?A única solução que funcionou para mim ao usar os compartilhamentos de rede CodeBase e UNC foi:
Também funciona com URIs normais.
fonte
GetExecutingAssembly()
porGetCallingAssembly()
.AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory
. A primeira parte é para aplicativos da Web e a segunda para outros aplicativos.Isso deve funcionar, a menos que a montagem seja copiada pela sombra :
fonte
Que tal isso:
fonte
Eu suspeito que o problema real aqui é que o executor de teste está copiando sua montagem para um local diferente. No tempo de execução, não há como dizer de onde a montagem foi copiada, mas você provavelmente pode ativar um botão para informar ao executor de teste que execute a montagem de onde está e não copiá-la para um diretório de sombra.
É provável que essa mudança seja diferente para cada corredor de teste, é claro.
Você já pensou em incorporar seus dados XML como recursos dentro do seu conjunto de teste?
fonte
Assembly.CodeBase
.funciona com a interface gráfica do usuário MbUnit.
fonte
Acredito que isso funcionaria para qualquer tipo de aplicativo:
fonte
Até onde eu sei, a maioria das outras respostas tem alguns problemas.
A maneira correta de fazer isso para um assembly não baseado em disco (baseado na Web) e não no GAC é usar o assembly atualmente em execução
CodeBase
propriedade .Isso retorna um URL (
file://
). Em vez de mexer com a manipulação de strings ouUnescapeDataString
, isso pode ser convertido com o mínimo de barulho, aproveitando aLocalPath
propriedade deUri
.fonte
#
(EscapedCodeBase
obras, mas EscapedCodeBase não funciona se o caminho contiver por exemplo%20
verbatim (que é uma seqüência permitido personagem em um caminho Windows)GetExecutingAssembly()
porGetCallingAssembly()
.Que tal agora ...
Em seguida, basta cortar o que você não precisa
fonte
fonte
Aqui está uma porta VB.NET do código de John Sibly. O Visual Basic não diferencia maiúsculas de minúsculas; portanto, alguns de seus nomes de variáveis estavam colidindo com nomes de tipos.
fonte
Em todos esses anos, ninguém mencionou esse. Um truque que aprendi com o incrível projeto ApprovalTests . O truque é que você use as informações de depuração no assembly para encontrar o diretório original.
Isso não funcionará no modo RELEASE, nem com as otimizações ativadas, nem em uma máquina diferente daquela em que foi compilada.
Mas você obterá caminhos relativos ao local do arquivo de código-fonte do qual você o chama
fonte
O diretório atual em que você existe.
Se você copiar o arquivo .xml com o build, deverá encontrá-lo.
ou
fonte
Environment.CurrentDirectory
funciona se você estiver usando o reflexo na classe de tarefa MSBuild, onde o assembly em execução reside no GAC e seu código está em outro lugar.Estou usando Assembly.CodeBase em vez de Location:
Está funcionando, mas não tenho mais certeza de que está 100% correto. A página em http://blogs.msdn.com/suzcook/archive/2003/06/26/assembly-codebase-vs-assembly-location.aspx diz:
"O CodeBase é um URL para o local onde o arquivo foi encontrado, enquanto o Local é o caminho em que ele foi realmente carregado. Por exemplo, se o assembly foi baixado da Internet, seu CodeBase pode começar com" http: // " , mas o local pode começar com "C: \". Se o arquivo foi copiado na sombra, o local seria o caminho para a cópia do arquivo no diretório da cópia de sombra. Também é bom saber que o CodeBase não é garantido no entanto, o local sempre será definido para os assemblies carregados do disco. "
Você pode usar o CodeBase em vez de Local.
fonte
Você pode obter o caminho da lixeira por AppDomain.CurrentDomain.RelativeSearchPath
fonte
Todas as respostas propostas funcionam quando o desenvolvedor pode alterar o código para incluir o snippet necessário, mas se você quiser fazer isso sem alterar nenhum código, poderá usar o Process Explorer.
Ele listará todas as dlls em execução no sistema; talvez seja necessário determinar a identificação do processo do aplicativo em execução, mas isso geralmente não é muito difícil.
Eu escrevi uma descrição completa de como fazer isso para uma dll dentro do II - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web -servidor/
fonte
em um aplicativo de formulário do Windows, você pode simplesmente usar
Application.StartupPath
mas para DLLs e aplicativos de console o código é muito mais difícil de lembrar ...
fonte
fonte
Você receberá um diretório incorreto se um caminho contiver o símbolo '#'. Então, eu uso uma modificação da resposta John Sibly que é a combinação UriBuilder.Path e UriBuilder.Fragment:
fonte
Isto é o que eu vim com. Entre os projetos da web, testes de unidade (executor de teste de unidade de nunit e resharper) ; Eu achei que isso funcionou para mim.
Eu tenho procurado por código para detectar em qual configuração está a compilação
Debug/Release/CustomName
,. Infelizmente, o#if DEBUG
. Então, se alguém puder melhorar isso !Sinta-se livre para editar e melhorar.
Obtendo a pasta do aplicativo . Útil para raízes da web, unittests para obter a pasta de arquivos de teste.
Obtendo a pasta bin : Útil para executar montagens usando reflexão. Se os arquivos forem copiados lá devido às propriedades de construção.
fonte
Isso deve funcionar:
Estou usando isso para implantar bibliotecas de arquivos DLL junto com algum arquivo de configuração (isso é para usar o log4net de dentro do arquivo DLL).
fonte
fileMap
utilizado aqui?Acho minha solução adequada para a recuperação do local.
fonte
Eu tive o mesmo comportamento no
NUnit
passado. Por padrão,NUnit
copia sua montagem no diretório temp. Você pode alterar esse comportamento nasNUnit
configurações:Talvez
TestDriven.NET
e aMbUnit
GUI tenha as mesmas configurações.fonte
Eu uso isso para obter o caminho para o diretório Bin:
Você obtém este resultado:
fonte
Aplicação web?
fonte