Visual Studio 2015 で、サードパーティの 64 ビット ネイティブ c++ .dll を含む c++ プロジェクト "managedDllWrapper" の ac# ラッパーである ac# .dll-project "dotnetWrapper" を参照する Web プロジェクトを構築しようとしました。
参照プロジェクトと Web プロジェクトは、.Net Framework 4.6.1 および x64 で実行されます。VS2015 は iis Express 64 ビットを使用します。
すべてが正常にコンパイルされます。
VS2015 でローカル Web サーバーを起動すると (緑色のスタート ボタンを押す)、「managedDllWrapper.dll」またはその依存関係の 1 つが見つからないというエラー メッセージが表示されます。
「/」アプリケーションでサーバー エラーが発生しました。
ファイルまたはアセンブリ 'managedDllWrapper.DLL' またはその依存関係の 1 つを読み込めませんでした。指定されたモジュールが見つかりませんでした。
説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。
例外の詳細: System.IO.FileNotFoundException: ファイルまたはアセンブリ 'managedDllWrapper.DLL' またはその依存関係の 1 つを読み込めませんでした。指定されたモジュールが見つかりませんでした。
ソース エラー:
現在の Web 要求の実行中に未処理の例外が生成されました。例外の発生元と場所に関する情報は、以下の例外スタック トレースを使用して特定できます。
スタックトレース:
[FileNotFoundException: ファイルまたはアセンブリ 'managedDllWrapper.DLL' またはその依存関係の 1 つを読み込めませんでした。指定されたモジュールが見つかりませんでした。] System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +0
System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +234
System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean forIntrospection) +108
System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +25
System.Reflection.Assembly.Load(String assemblyString) +34 System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +49
[ConfigurationErrorsException: ファイルまたはアセンブリ 'managedDllWrapper.DLL' またはその依存関係の 1 つを読み込めませんでした。指定されたモジュールが見つかりませんでした。]
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +772
System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() +259
System.Web.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai) +163
System.Web.Compilation.<>c.b__143_0(AssemblyInfo ai) +29
System.Linq.d__16'2.MoveNext() +293
System.Linq.d__66'1.MoveNext() +100
System.Linq.d__63'1.MoveNext() +73
System.Web.UI.Util.GetTypeFromAssemblies(IEnumerable アセンブリ、文字列 typeName、ブール値の ignoreCase) +217
System.Web.Compilation.BuildManager.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase) +266
System.Web.Configuration.HandlerFactoryCache.GetTypeWithAssert(文字列型) +48
System.Web.Configuration.HandlerFactoryCache.GetHandlerType(文字列型) +17
System.Web.Configuration.HandlerFactoryCache..ctor(文字列型) +25
System.Web.HttpApplication.GetFactory(文字列型) +104
System.Web.MaterializeHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +262
System.Web.HttpApplication.ExecuteStep(IExecutionStep ステップ、ブール値 & 完了した同期) +137
バージョン情報: Microsoft .NET Framework バージョン:4.0.30319; ASP.NET バージョン:4.6.1055.0
ネイティブ dll (依存関係) は web-project bin フォルダー (手動でコピー) にあることに注意してください。
ネイティブ dll を C:\Windows\ フォルダーにコピーすると、Web アプリケーションはスムーズに正常に動作します。どういうわけか、Web アプリケーションの dll 検索パスは C:\Windows\ フォルダーのみを指していますが、Web アプリケーションの実行 (bin) フォルダーも調べる必要がありますよね?
Web アプリケーションではなく、すべての dll を含むラッパーも含む C# コンソール テスト アプリケーションを実行すると、dll の test-app bin フォルダーへのコピーが正常に機能し、アプリケーションが実行されます。この問題が発生するのは Web アプリケーションのみで、bin フォルダー内の dll を受け入れません。
また、dll を C:\Windows\ ディレクトリにコピーして Web アプリケーションを実行し、再度 dll を削除しようとすると、次の理由で削除できないと表示されます。
ファイルが IIS Express ワーカー プロセスで開かれているためです。
したがって、VS2015 ではなく IIS の問題である可能性がありますが、IIS を構成できません (または方法がわかりません)。Visual Studio 2015 に付属の IIS Express を使用しています。
Google と stackoverflow でのすべての調査結果は次のとおりです。
- dll を bin フォルダーにコピーします (試してみましたが、上記のように機能しません。C# コンソール アプリでのみ機能し、Web アプリでは機能しません)。
- プロジェクトで直接dllを参照する(不可能:)
「[..].dll を追加できませんでした。ファイルにアクセスできること、および有効なアセンブリまたは COM コンポーネントであることを確認してください。」
- すべてが 64 ビットであり、同じ .Net バージョンであるかどうかを確認します (チェック済み、64 ビット、.Net 4.6.1。また、コンソール アプリでは正常に動作しますが、Web アプリでは動作しません)。
- web.config を変更して、さらに .dll フォルダーを追加します。しかし、これも役に立ちませんでした。
MS azurewebsites の C:\Windows\ フォルダーに 17 の .dll を追加することが許可されているとは思えないため、Web プロジェクトによって C:\Windows\ とは異なるフォルダーで .dll が検出されれば幸いです。サイトを公開したいとき。次に、パスは何らかの方法でアプリケーション フォルダー内にある必要があります。