私が書いている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")
あなたが探している 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:\
)が含まれますが、これは削除する必要があります。
指摘されているように、反射はあなたの友人です。ただし、正しい方法を使用する必要があります。
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.
私の場合(Outlookに[ファイルとして]読み込まれたアセンブリを扱う):
typeof(OneOfMyTypes).Assembly.CodeBase
CodeBase
でのLocation
(Assembly
ではない)の使用に注意してください。他の人は、アセンブリを見つける別の方法を指摘しています。
System.Reflection.Assembly.GetExecutingAssembly().Location
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を決定する必要があるかもしれませんが、通常はそれほど難しくありません。