私の目標は、ASP.NET アプリケーションから P/Invoke を介してネイティブ DLL を呼び出すことです。これまでのところ、コンソール アプリから、または Azure WorkerRole でホストされている HttpListener で実行されている OWIN サーバーからでも、DLL を正常に呼び出すことができます。
単純な ASP.NET アプリまたは Azure WebRole のいずれかで、まったく同じコードを ASP.NET/IIS でホストしようとすると、問題が発生します。このようなコンテキストでは、DLL を呼び出すと AccessViolationException がスローされます。
私の調査によると、問題はネイティブ DLL がスレッド セーフではないという事実に起因しているように見えます。また、コンソール アプリでも同時スレッドから呼び出そうとするテストで AVE がスローされ、それがスレッドではないことが示されます。確かに安全。そのため、DLL の作成者に確認しています。
しかし、それが本当に ASP.NET/IIS でのクラッシュの根本的な原因なのかどうかはまだ疑問です。テスト中は、一度に 1 つの要求しか実行しないからです。スレッド セーフが修正されるのを待って、ASP.NET/IIS で P/Invoke が失敗する原因となる可能性のある他の特定事項を知っているかどうかを知りたいと思いました。
アップデート
何度もテストした結果、DLL が外部ファイルを読み込もうとしたことがクラッシュの原因であることが判明しました。IIS 以外のアプリケーションでは、これらのファイルを DLL と同じフォルダ レベルに配置するだけで機能します。しかし、たとえば私の開発マシンでは、IIS で実行されている同じコードが「C:\Program Files (x86)\IIS Express」でファイルを検索しようとします。
だから私の質問は次のとおりです。単純なものFile.Open
が探すパスを制御する方法はありますか?そうでない場合は、起動時に必要なファイルをそこにコピーできるようにデフォルトのパスを取得する方法はありますか?
ありがとう