スタートアッププログラムとして起動された場合を除き、私のプログラムは完全に実行されます。起動プログラムとして起動すると、ファーストパーティのDLL(またはその1つの依存関係)を見つけることができません。スタートアッププログラムとしてのランでDLLが見つからない
は、私は次の例外を取得:
ファイルまたはアセンブリXまたはそれの一つが依存関係をですが見つかりませんでした:C:\ WINDOWS \ SYSWOW64 \ X.dll
それが探しているのローカルディレクトリC:\Program Files\MyProgram\
ではなく、C:\Windows\SysWOW64\
ディレクトリにある第1者DLLを使用します。
私がプログラムを手動で起動すると、すべてがうまく動作します。
この問題の原因を突き止めるにはどうすればよいですか?私はFusion Logを使ってみましたが、それは例外として同じことを教えてくれました:それはC:\Windows\SysWOW64
からロードしようとしていました。
これは、アプリケーションが使用する場合に発生する可能性があります。Assembly.Load
- 犯人プログラムはAssembly.LoadFrom
を使用しますが、起動時に実行した場合を除いて正常です。
また、原因プログラムには、一部の[DllImport]
属性があります。
常に、**常に**、ファイルの絶対パス名を指定します。 "baz.dll"ではなく、 "c:\ foo \ bar \ baz.dll"でなければなりません。 Environment.CurrentDirectoryは、可能な最悪のグローバル変数です。そして確かに、Runレジストリキーを使用するときにどこにあるのか期待していません。 Application.StartupPathまたはAssembly.GetEntryAssembly()を使用して、そのパスの書式を設定します。 –
@HansPassant ...すばらしい答えですが、これでコメントに入れました。残りの部分はどこに残っていますか? :-)質問を開いたままにするか、まったく同じ情報を回答ボックスに入れます(ugh)。あなたはそれが重複として閉じられることを期待していますか? –
'Assembly.LoadFrom'のドキュメントでは相対パスを受け付けるので、パスを指定しません。DLLの名前だけを与えます。私は絶対的な道を試みたが、これはうまくいった。プログラムがスタートアッププログラムのときに 'Assembly.LoadFrom'がアプリケーションベースを使用しない理由はわかりません。 – maddisoj