質問: DLL_Func1(); //for win32 API } } ``` 【ビルド手順】 1) 上記プロジェクト2(c++/cli)のビルド ・構成プロパティ-[全般]-[出力ディレクトリ] をプロジェクト1の$(SolutionDir)\LLS\bin\Debug\に設定 ・構成プロパティ-[リンカー]-[追加の依存ファイル] でfunc.lib(win32 API)を追加 ・ビルド実行 → Wrapper.dllの生成を確認 2) 上記プロジェクト1(c#)のビルド ・ソリューションエクスプローラのLLS下の参照で[参照の追加]-Wrapper.dllを追加 ・ビルド実行 → LLS.dllの生成を確認 ### 発生している問題・エラーメッセージ 両プロジェクトのビルド後に、Visual Studio 2015で[F5]を押し、実行させると、 ブラウザが表示し、以下のエラーが表示されます。 ``` '/'アプリケーションでサーバー エラーが発生しました。 ファイルまたはアセンブリ'Wrapper.DLL'、またはその依存関係の1つが読み込めませんでした。指定されたモジュールが見つかりません。 ``` ### 補足情報 ・プロジェクト2のWrapper.cppで、//for win32 API部分をコメントアウトし、func_1()内に適当な関数を記載し、ビルド→実行させると動作します。したがって、win32 APIの部分が問題だと予想しております。 ・ソリューションエクスプローラのプロジェクト2(LLS)下の参照で[参照の追加]-func.dllを追加しようとしましたが、『"~\func.dll"への参照を追加できませんでした。ファイルがアクセス可能で、有効なアセンブリまたはCOMコンポーネントであることを確認してください』とのエラーが発生します。 色々理解できていない点が多いため、記載内容に不十分な点があると思いますが、 どうぞよろしくお願いします。
回答: ASP.NET内でC++/CLIのモジュールを使用する時、CPUアーキテクチャが合わないと、DLLが見つからないエラーが出る場合があります(AnyCPUはC++/CLIではできません)。 C++/CLI側DLLのCPUアーキテクチャとアプリケーションプールの"32bitアプリケーションの有効化(enable32bitapponwin64)"の設定が合っているか、確認するのはどうでしょうか。 ASP.NETはデフォルトでアセンブリのシャドウコピーを行っています。C++/CLIを含むマネージドアセンブリは自動的にコピー対象になりますが、ネイティブDLLはコピーされません。 https://docs.microsoft.com/en-us/dotnet/framework/app-domains/shadow-copy-assemblies そのため、ネイティブDLLを参照する場合、システム環境変数のパスが通っている場所にネイティブDLLをコピーする必要があります。