QA@IT

ASP.NETでDllImportで指定したモジュールをbinに置いても見付からないと怒られる

7109 PV

こんにちは、お世話になります。

ASP.NET(C# 2.0)でHTTPモジュールを作成しました。
そのモジュール内では、C/C++ Codeで作成された外部のダイナミックライブラリを
下記の方法で参照しています。

[DllImport("●●●.dll", CallingConvention = CallingConvention.Cdecl)]

HTTPモジュールのコンパイルは通るのですが、

DLL '●●●.dll' を読み込めません: 指定されたモジュールが見つかりません。 (HRESULT からの例外: 0x8007007E)

とエラーになります。
binに置いたり、windowsディレクトリ内に置いたり、windows\system32ディレクトリ内に置いたり、
Everyoneの参照権限を与えたりしましたが、エラーが出続けます。

HTTPモジュール内で参照設定できないか試しましたが、「有効なアセンブリまたはCOMコンポーネットであることを確認してください」
と言われて追加できません。私が作成した●●●.dllではないため●●●.dllを変更する事もできません。

●●●.dllをどこに置き、どのような設定にすればよいのか教えてください。

宜しくお願い致します。

  • ASP.NET以外、例えばC#のコンソールアプリケーションからであればそのDllImportで読み込めて呼び出せますか? -
  • GUIアプリからはDllImportで読み込みできます。その時は、EXEと同じ場所に置いて動かしています。 -

回答

アンマネージdllの話ですので、普通通りにbinやGACからは読み込めません。
GACには配置も出来ません。
実行しているのはw3wp.exeになるので、こいつが直に読み込める場所におく必要があるはずです。
同じフォルダかフルパス指定してそこに置くか、PATHに追加するか。
でもシステムフォルダに置いたなら読めそうな気もしないでもないですね。
もしかしたら他に何かあるかもしれません。

編集 履歴 (0)
  • ただしIIS7以降の統合パイプラインモードだとちょっと状況が違うかもしれません。 -

置き場所がどこかと言う質問に関しては、GAC またはアプリケーションルート直下の Bin フォルダということになります。

ASP.NET Web サイト内の共有コード フォルダ
https://msdn.microsoft.com/ja-jp/library/t990ks23(v=VS.100).aspx

ついでながらの情報ですが、GAC, Bin の優先順位については以下の記事が参考になると思います。

ASP.net assembly loading from GAC or Bin
http://blogs.msdn.com/b/pranav_rastogi/archive/2010/10/18/asp-net-assembly-loading-from-gac-or-bin.aspx

今回 Bin に置いたということですので、置き場所の問題ではなく、別の問題(それは私には分かりませんが)があると思います。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。