2016-07-01 7 views
0

スタートアッププログラムとして起動された場合を除き、私のプログラムは完全に実行されます。起動プログラムとして起動すると、ファーストパーティの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]属性があります。

+2

常に、**常に**、ファイルの絶対パス名を指定します。 "baz.dll"ではなく、 "c:\ foo \ bar \ baz.dll"でなければなりません。 Environment.CurrentDirectoryは、可能な最悪のグローバル変数です。そして確かに、Runレジストリキーを使用するときにどこにあるのか期待していません。 Application.StartupPathまたはAssembly.GetEntryAssembly()を使用して、そのパスの書式を設定します。 –

+0

@HansPassant ...すばらしい答えですが、これでコメントに入れました。残りの部分はどこに残っていますか? :-)質問を開いたままにするか、まったく同じ情報を回答ボックスに入れます(ugh)。あなたはそれが重複として閉じられることを期待していますか? –

+0

'Assembly.LoadFrom'のドキュメントでは相対パスを受け付けるので、パスを指定しません。DLLの名前だけを与えます。私は絶対的な道を試みたが、これはうまくいった。プログラムがスタートアッププログラムのときに 'Assembly.LoadFrom'がアプリケーションベースを使用しない理由はわかりません。 – maddisoj

答えて

0

問題はAssembly.LoadFromと現在のディレクトリを起動時に使用することと関係がありました。

Assembly.LoadFrom状態それこと:

assemblyFileはカレントディレクトリ絶対または相対であってもよく、アセンブリは、呼び出し元のドメインにロードされます。

プログラムが起動プログラムとして設定されている場合は現在のディレクトリが何らかの理由で C:\Windows\SysWOW64です。

Directory.GetCurrentDirectory()を出力することで実証できます。

通常のプロービングに従わないAssembly.LoadFromの代わりに、Assembly.Loadを使用しています。これは、DLLが含まれている通常のディレクトリを検索するためです。ランタイムがホスト、またはアプリケーションドメインのApplicationBaseとPrivateBinPathにされている場合GACで、ホスト組立ストア内:

  • ロードコンテキストが探査で見つかったアセンブリが含まれています。 Loadメソッドのほとんどのオーバーロードはアセンブリをこのコンテキストにロードします。

  • ロード元のコンテキストには、プロービングによって検索されたディレクトリに含まれていないパスをユーザーが提供したアセンブリが含まれています。 LoadFrom、CreateInstanceFrom、およびExecuteAssemblyは、パス単位でロードするメソッドの例です。

融合は、それが唯一のC:\Windows\SysWOW64でのDLLを探していた私に言った理由も説明して - それはLoadFromが何をするかだとして、指定したディレクトリだけで検索します。私の場合は現在のディレクトリです。

関連する問題