[C#] Come ottengo il percorso dell'assembly in cui si trova il codice?



Answers

questo aiuta?

//get the full location of the assembly with DaoTests in it
string fullPath = System.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location;

//get the folder that's in
string theDirectory = Path.GetDirectoryName( fullPath );
Question

C'è un modo per ottenere il percorso per l'assembly in cui risiede il codice corrente? Non voglio il percorso dell'assembly chiamante, solo quello che contiene il codice.

Fondamentalmente il mio test unitario ha bisogno di leggere alcuni file di test xml che si trovano relativamente alla DLL. Voglio che il percorso si risolva sempre correttamente indipendentemente dal fatto che la dll di test venga eseguita da TestDriven.NET, dalla GUI MbUnit o da qualcos'altro.

Modifica : Le persone sembrano fraintendere quello che sto chiedendo.

La mia biblioteca di test si trova in dire

C: \ projects \ MyApplication \ daotests \ bin \ Debug \ daotests.dll

e vorrei ottenere questo percorso:

C: \ projects \ MyApplication \ daotests \ bin \ Debug \

I tre suggerimenti finora mi mancano quando corro da MbUnit Gui:

  • Environment.CurrentDirectory fornisce c: \ Programmi \ MbUnit

  • System.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location fornisce C: \ Documents and Settings \ george \ Impostazioni locali \ Temp \ .... \ DaoTests.dll

  • System.Reflection.Assembly.GetExecutingAssembly().Location assomiglia al precedente.




La directory corrente in cui esisti.

Environment.CurrentDirectory;  // This is the current directory of your application

Se copi il file .xml con build, dovresti trovarlo.

o

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetAssembly(typeof(SomeObject));

// The location of the Assembly
assembly.Location;



var assembly = System.Reflection.Assembly.GetExecutingAssembly();
var assemblyPath = assembly.GetFiles()[0].Name;
var assemblyDir = System.IO.Path.GetDirectoryName(assemblyPath);



Cosa ne pensi di questo ...

string ThisdllDirectory = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

Quindi rimuovi ciò che non ti serve




Come la risposta di John, ma un metodo di estensione leggermente meno dettagliato.

public static string GetDirectoryPath(this Assembly assembly)
{
    string filePath = new Uri(assembly.CodeBase).LocalPath;
    return Path.GetDirectoryName(filePath);            
}

Ora puoi fare:

var localDir = Assembly.GetExecutingAssembly().GetDirectoryPath();

o se preferisci:

var localDir = typeof(DaoTests).Assembly.GetDirectoryPath();



Questo dovrebbe funzionare:

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
Assembly asm = Assembly.GetCallingAssembly();
String path = Path.GetDirectoryName(new Uri(asm.EscapedCodeBase).LocalPath);

string strLog4NetConfigPath = System.IO.Path.Combine(path, "log4net.config");

Sto usando questo per distribuire librerie di file DLL insieme ad alcuni file di configurazione (questo è per usare log4net dal file DLL).




Questo dovrebbe funzionare, a meno che l'assembly non sia copiato in ombra :

string path = System.Reflection.Assembly.GetExecutingAssembly().Location



Ho avuto lo stesso comportamento nel NUnit in passato. Di default NUnit copia il tuo assembly nella directory temporanea. È possibile modificare questo comportamento nelle impostazioni NUnit :

Forse TestDriven.NET e MbUnit GUI hanno le stesse impostazioni.




Che dire di questo:

System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);



Tutte le risposte proposte funzionano quando lo sviluppatore può modificare il codice per includere lo snippet richiesto, ma se si desidera eseguire questa operazione senza modificare alcun codice, è possibile utilizzare Process Explorer.

Elencherà tutte le DLL di esecuzione sul sistema, potrebbe essere necessario determinare l'id di processo dell'applicazione in esecuzione, ma di solito non è troppo difficile.

Ho scritto una descrizione completa di come farlo per una dll all'interno di II - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web-server/




string path = Path.GetDirectoryName(typeof(DaoTests).Module.FullyQualifiedName);



Ecco una porta VB.NET del codice di John Sibly. Visual Basic non fa distinzione tra maiuscole e minuscole, quindi un paio dei suoi nomi di variabili sono in collisione con i nomi dei tipi.

Public Shared ReadOnly Property AssemblyDirectory() As String
    Get
        Dim codeBase As String = Assembly.GetExecutingAssembly().CodeBase
        Dim uriBuilder As New UriBuilder(codeBase)
        Dim assemblyPath As String = Uri.UnescapeDataString(uriBuilder.Path)
        Return Path.GetDirectoryName(assemblyPath)
    End Get
End Property



Applicazione web?

Server.MapPath("~/MyDir/MyFile.ext")





Links