現在実行中のDLLの場所を取得するにはどうすればよいですか?


93

作成しているdllの実行の一部としてロードする必要のある構成ファイルがあります。

私が抱えている問題は、アプリの実行時にdllと構成ファイルを配置した場所が「現在の場所」ではないことです。

たとえば、ここにdllファイルとxmlファイルを配置します。

D:\ Program Files \ Microsoft Team Foundation Server 2010 \ Application Tier \ Web Services \ bin \ Plugins

しかし、次のように(dll内の)xmlファイルを参照しようとすると:

XDocument doc = XDocument.Load(@".\AggregatorItems.xml")

次に、。\ AggregatorItems.xmlは次のように変換されます。

C:\ windows \ system32 \ inetsrv \ AggregatorItems.xml

したがって、現在実行中のdllがどこにあるかを知る方法を見つける必要があります(私は願っています)。基本的に私はこれを探しています:

XDocument doc = XDocument.Load(CoolDLLClass.CurrentDirectory+@"\AggregatorItems.xml")

回答:


138

あなたは探している System.Reflection.Assembly.GetExecutingAssembly()

string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string xmlFileName = Path.Combine(assemblyFolder,"AggregatorItems.xml");

注意:

この.Locationプロパティは、現在実行中のDLLファイルの場所を返します。

一部の条件下では、DLLは実行前にシャドウコピーされ、.Locationプロパティはコピーのパスを返します。元のDLLのパスが必要な場合は、Assembly.GetExecutingAssembly().CodeBase代わりにプロパティを使用してください。

.CodeBaseプレフィックス(file:\)が含まれていますが、削除する必要がある場合があります。


8
ああ!それが戻ってきますC:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\Temporary ASP.NET Files\\tfs\\de3c0c8e\\c1bdf790\\assembly\\dl3\\20b156cb\\22331f24_bfb9cb01\\AggregatorItems.xml
Vaccano 2011年

23
ああ!しかしAssembly.GetExecutingAssembly().CodeBase、それはあります!
Vaccano 2011年

2
CodeBaseからfile:\\ c:\ myassemblypathが返されましたが、これは奇妙です
Matt

10
@Mattは新しいUri(Assembly.GetExecutingAssembly()。CodeBase).LocalPathを使用して本名を取得します
Larry

2
string curAssemblyFolder = new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath;
マーティンコネル2018

36

指摘されているように、リフレクションはあなたの友達です。ただし、正しい方法を使用する必要があります。

Assembly.GetEntryAssembly()     //gives you the entrypoint assembly for the process.
Assembly.GetCallingAssembly()   // gives you the assembly from which the current method was called.
Assembly.GetExecutingAssembly() // gives you the assembly in which the currently executing code is defined
Assembly.GetAssembly( Type t )  // gives you the assembly in which the specified type is defined.

16

私の場合([ファイルとして] Outlookにロードされたアセンブリを処理する):

typeof(OneOfMyTypes).Assembly.CodeBase

CodeBase(ではなくLocation)を使用していることに注意してくださいAssembly。他の人は、アセンブリを見つける別の方法を指摘しています。



1

asp.netアプリケーションを使用していて、デバッガーを使用するときにアセンブリを見つけたい場合、それらは通常、一時ディレクトリに配置されます。私はそのシナリオを支援するためにこのメソッドを作成しました。

private string[] GetAssembly(string[] assemblyNames)
{
    string [] locations = new string[assemblyNames.Length];


    for (int loop = 0; loop <= assemblyNames.Length - 1; loop++)       
    {
         locations[loop] = AppDomain.CurrentDomain.GetAssemblies().Where(a => !a.IsDynamic && a.ManifestModule.Name == assemblyNames[loop]).Select(a => a.Location).FirstOrDefault();
    }
    return locations;
}

詳細については、このブログ投稿http://nodogmablog.bryanhogan.net/2015/05/finding-the-location-of-a-running-assembly-in-net/を参照してください。

ソースコードを変更したり、再デプロイしたりできないが、コンピューターで実行中のプロセスを調べることができる場合は、ProcessExplorerを使用します。ここに詳細な説明を書きました。

システム上で実行中のすべてのdllが一覧表示されます。実行中のアプリケーションのプロセスIDを確認する必要がある場合がありますが、通常はそれほど難しくありません。

IIS内のdllに対してこれを行う方法の完全な説明を書きました-http ://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web -サーバ/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.