0

私の目標は、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が探すパスを制御する方法はありますか?そうでない場合は、起動時に必要なファイルをそこにコピーできるようにデフォルトのパスを取得する方法はありますか?

ありがとう

4

2 に答える 2

0

あなたが観察したことは、単に相対パスを使用していることを示しています。つまり、(IIS ではなく) IIS Express で実行しC:\Program Files (x86)\IIS Expressている場合、相対パスを解釈するときに使用するベース ディレクトリであると想定されるため、プロセスはその下を検索しようとします。

相対パスではなく絶対パスを常に使用する必要があります。そうすれば、この問題は発生しません。

http://msdn.microsoft.com/en-us/library/ms178116(v=vs.100).aspx

于 2013-10-29T05:43:38.950 に答える