web-dev-qa-db-ja.com

DLL現在実行中の場所を取得する方法は?

私が書いているdllの実行の一部としてロードする必要がある設定ファイルがあります。

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

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

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

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

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

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

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

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

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

あなたが探している 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:\)が含まれますが、これは削除する必要があります。

109
BrokenGlass

指摘されているように、反射はあなたの友人です。ただし、正しい方法を使用する必要があります。

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.
32
Nicholas Carey

私の場合(Outlookに[ファイルとして]読み込まれたアセンブリを扱う):

typeof(OneOfMyTypes).Assembly.CodeBase

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

14
user166390
System.Reflection.Assembly.GetExecutingAssembly().Location
4
Hawxby

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/

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

システム上で実行中のすべてのdllがリストされます。実行中のアプリケーションのプロセスIDを決定する必要があるかもしれませんが、通常はそれほど難しくありません。

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

1
Bryan