2017-01-19 9 views
3

私はアプリを持っていると言う:C:\ MyPrograms \ App.exe動的に読み込まれたアセンブリの場所を取得

このアプリはlibrary.dllを参照していません。 App.exeは動的にアセンブリを読み込むことができます。

とのは、DLLへのパスがCであることを言わせて:\ MyPrograms \ DLLを\

library.dll私は関係なく、私が試したものを、実行アセンブリ(APP.EXE)のパスを取得することはできません。

GetExecutingAssemblyを()

GetEntryAssembly()

AppDomain.CurrentDomain.BaseDirectory

動的にロードされるDLLの場所を取得する方法はありますか?すべてがちょうど返し、例えば、APP.EXE

EDIT 1の場所: 言い換えOP ...

はMYAPP.EXEは、DLLへのパスを渡し経由して、任意のDLLを呼び出すことができます。このDLLは、ユーザーがどこにでも置くことができます。ハードコーディングのパスなどを除外します。

私がしたいのは、動的に読み込まれたDLLの現在の場所を取得できることです。つまり、エラーを処理するには、DLLが入っているのと同じディレクトリにエラーログを書き込むことができます。

ロードされたDLLがどこにあるかを見つけて試しましたが、呼び出しアセンブリ(MyApp.exe)のディレクトリを返すか、まったく返しません。

+0

パスを取得することができますか? –

+0

['AssemblyResolve'](https://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve(v = vs.110).aspx)イベントを処理したいようなサウンド... –

+0

あなたはエラーをログに記録していると言いますが、エラーの原因となったDLLをどのように検出していますか?あなたのパスに 'var path = MagicFunctionThatGetsPath(sourceDll)'を置く必要がある行のために、あなたの質問でどのように動作するかのコード例を書くことができますか? 'sourceDll'の使い方を知りたいそのオブジェクトのタイプは何でしょうか。 –

答えて

3

System.Reflection.Assemblyクラスには、マニフェストを含むロードされたファイルのパスまたはUNCの場所を取得するプロパティLocationがあります。たとえば、このようにアセンブリをロードする場合、

var assembly = System.Reflection.Assembly.Load(@"<assembly name>"); 

assembly.Locationが返されます。 1を編集するには

回答:エラーを処理するために、この

を行うために、私はDLLが

である 同じディレクトリにエラーログを書き込むことができるようにしたいのですが

することができます

  1. Load an assembly to app domainとエラー・ログを置くことができますAppDomain.UnhandledExceptionを購読しますgingコード。このコードは、現在のドメインとそのベースディレクトリを認識します。
  2. アセンブリパスを呼び出す際に、アセンブリパス内で何らかの種類のコンテキストを渡して、ロギングロジックで使用します。 1つのスレッドでのみアセンブリメソッドを呼び出す場合は、スレッドコンテキストにすることができます。
+0

DLLのパスは不明です(当然私はどこに置いているのか分かります)。ただし、呼び出し元のアプリケーションはDLLへのパスを受け入れるように設計されているため、ユーザーはどこにでもDLLを配置できます。私は呼び出し元のアプリケーションのソースも持っていません。 assembly.Locationは、動的に呼び出されるDLL内で使用しようとすると何も返しません – CleverNameHere

+0

質問では、「動的にアセンブリを読み込む」ことができます。これを行う方法はいくつかあります。https://msdn.microsoft.com/en-us/library/25y1ya39(v=vs.110).aspxしかし、とにかくアプリケーションは、ロードされたアセンブリインスタンスへの参照を持つ必要があります。あるいは、「動的にアセンブリを読み込むことができる」とは何かを意味しますか? –

+0

呼び出し元のアプリケーションには何らかの参照があります。問題は、これまで何を試しても、呼び出し元のアプリケーションのディレクトリしか取得できないということです。私は、動的にロードされたDLL内から、現在のディレクトリを取得して、同じ場所にログを書き込むか、設定ファイルを探すようなことをする方法を見つけたいと思います。 DLLがWindowsにどこに置かれても、現在の場所を取得する方法を探しています。読み込まれたときと同じように、現在のディレクトリを文字列などに格納します。 – CleverNameHere

0

あなたは、あなたがこれを行うことができますMyDynLoadObjectと呼ばれるクラスを定義した動的にロードされたアセンブリ自体の内部にある場合:

Assembly assem = Assembly.GetAssembly(typeof(MyDynLoadObject)); 

は編集:もう一つの方法は、行く:

public class MyDynLoadObject 
{ 
    public MyDynLoadObject() 
    { 

     Assembly assem = this.GetType().Assembly; 

    } 
} 
+0

assem.Locationプロパティは何も返しません。そして私は動的に呼び出されるDLLの内部を取得するコードを書いています。 – CleverNameHere

+0

@CleverNameHere:Strange - それは私のために働く。私の編集を見てください。 –

関連する問題