2012-02-09 27 views
9

Tôi phải bao gồm một (quản lý) C++/CLI thành phần trong một trong các dự án ASP.NET của tôi, tham chiếu cho chính nó một số khác (không được quản lý) C++ DLL. Nên là không có vấn đề - NET 3.5 là hạnh phúc khi biên dịch dự án, mọi thứ có vẻ tốt. Thành phần C++/CLI và các C++ DLL khác được biên dịch bởi một bộ phận khác như là phiên bản Release với "Any CPU" trong Visual Studio 2005. Gói VC + 2005 Redistributable được cài đặt. Và cùng một mã hoạt động mà không có vấn đề khi tôi chạy nó bên trong một ứng dụng giao diện điều khiển .NET bình thường."mô-đun không thể tìm thấy" lỗi với thành phần C++/CLI trong ASP.NET

Bây giờ trong khi mã này hoạt động trong ứng dụng giao diện điều khiển, nó không được lưu trữ chính xác bởi ASP.NET - dẫn đến lỗi trên tải trang ban đầu (thậm chí trước khi bước vào Global.asax). Để thử nghiệm và gỡ lỗi, tôi đã sử dụng hai cấu hình máy:

  1. Local Dev PC: Windows XP, 32 Bit, VC++ 2005 Redist trọn gói, Visual Studio 2010, ASP.NET 3.5, Biên soạn "Bất kỳ CPU" , Hosting trong phát triển Web server (Cassini)
  2. Kiểm tra máy chủ (máy mục tiêu): Windows 7, 64 Bit, VC++ 2005 Redist trọn gói, Hosting trong IIS 7, AppPool đã "Enable Applications 32-Bit" thiết lập

Trên cả hai máy cùng một lỗi sau đây xảy ra khi tôi khởi động ứng dụng ASP.NET:

Exception Details: System.IO.FileNotFoundException: The specified module could not be found. (Exception from HRESULT: 0x8007007E) 

Source Error: 
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. 

Stack Trace: 
[FileNotFoundException: The specified module could not be found. (Exception from HRESULT: 0x8007007E)] 
System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +0 
System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +43 
System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +127 
System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +142 
System.Reflection.Assembly.Load(String assemblyString) +28 
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +46 

[ConfigurationErrorsException: The specified module could not be found. (Exception from HRESULT: 0x8007007E)] 
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +613 
System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() +203 
System.Web.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai) +105 
System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) +178 
System.Web.Compilation.WebDirectoryBatchCompiler..ctor(VirtualDirectory vdir) +163 
System.Web.Compilation.BuildManager.BatchCompileWebDirectoryInternal(VirtualDirectory vdir, Boolean ignoreErrors) +53 
System.Web.Compilation.BuildManager.BatchCompileWebDirectory(VirtualDirectory vdir, VirtualPath virtualDir, Boolean ignoreErrors) +175 
System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath) +86 
System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile) +261 
System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile) +101 
System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean noAssert) +126 
System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(VirtualPath virtualPath, Type requiredBaseType, HttpContext context, Boolean allowCrossApp, Boolean noAssert) +62 
System.Web.UI.PageHandlerFactory.GetHandlerHelper(HttpContext context, String requestType, VirtualPath virtualPath, String physicalPath) +33 
System.Web.UI.PageHandlerFactory.System.Web.IHttpHandlerFactory2.GetHandler(HttpContext context, String requestType, VirtualPath virtualPath, String physicalPath) +40 
System.Web.HttpApplication.MapHttpHandler(HttpContext context, String requestType, VirtualPath path, String pathTranslated, Boolean useAppConfig) +160 
System.Web.MapHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +93 
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155 

Bây giờ đây là kỳ lạ ... Nó không nói bất cứ điều gì về lắp ráp là mất tích, thậm chí Fuslogvw.exe hoặc sxstrace.exe không đăng nhập bất cứ điều gì. Hơn nữa của các tòa án có vẻ như là lỗi phụ thuộc vào C + +/CLI lắp ráp hoặc trên không được quản lý C + + DLL. Nếu tôi loại bỏ tham chiếu assembly C++/CLI từ dự án ASP.NET của tôi và mã, nó hoạt động tốt. Bây giờ vì C++/CLI phụ thuộc vào các DLL gốc C++ không được tham chiếu trong dự án ASP.NET, tôi đã sao chép tất cả các DLL C++ phụ thuộc vào thư mục "bin" của thư mục đầu ra của dự án ASP.NET (giống như bảng điều khiển workgin) ứng dụng). Trong khi mọi công cụ C++ đã được biên dịch trong chế độ Release, với gói VC + Redist Package đã được cài đặt đúng, cần có tất cả các phụ thuộc tại chỗ. Tất nhiên tôi biết có một FileNotFoundException, nhưng tôi không thể tìm ra những gì còn thiếu ...

Như đã nói: mã tương tự để truy cập thành phần C++/CLI hoạt động trong ứng dụng giao diện .NET 3.5 trên cả hai máy tính thử nghiệm Tôi có cùng một phụ thuộc triển khai) với cùng một phụ thuộc C + + DLL triển khai vào thư mục đầu ra, chỉ trong ASP.NET tôi nhận được lỗi trên.

Bất kỳ đề xuất nào về cách tôi có thể loại bỏ vấn đề hoặc cách tôi có thể theo dõi thêm?

(Tất nhiên là tôi đã tìm kiếm StackOverflow và Google cho các vấn đề, ví dụ như tôi tìm thấy những liên kết này, nhưng họ không giúp:
-"The specified module could not be found" error when running C# ASP.NET web service referring C++ dll
-Access x86 COM from x64 .NET
-ASP.NET application developed in 32 bit environment not working in 64 bit environment
-Module Not Found Exception From .NET 2.0 Web Service On Windows Server 2008 R2)

Trả lời

4

Mã của bạn đạt đến _nLoad và điều này là tốt vì đã vượt qua tất cả các kiểm tra để tải và di chuyển đến lõi để thực sự tải dll, và có thất bại của nó.

Để bắt đầu tải xuống Dependency Walker từ http://www.dependencywalker.com/ và sử dụng nó trên dll để tìm hiểu tài nguyên khác mà dll này cần để chạy. Tôi nghi ngờ rằng không thể tải một số tập tin dll khác.

Bổ sung có thể tìm kiếm dll này cho các tệp khác không thể tìm thấy và đó là lý do tại sao không thể tải. Cách thứ hai là sử dụng File Monitor hoặc Process Monitor từ sysinternals để tìm những gì không tải được.

http://technet.microsoft.com/en-us/sysinternals
http://technet.microsoft.com/en-us/sysinternals/bb896645

+0

Cảm ơn bạn trước. Tôi đã sử dụng Dependency Walker trước đây mà không tìm ra bất kỳ vấn đề gì. Tôi chỉ tự hỏi tại sao ứng dụng .NET console với cùng một assembly được triển khai hoạt động, trong khi ứng dụng ASP.NET không thành công? Thật lạ lùng ... – Matthias

+0

@Matthias khi tôi viết, có lẽ vì không tải được một số tệp tài nguyên. Sử dụng cũng theo dõi tập tin để tìm chúng. – Aristos

+0

Ok, với ProcMon (người dùng lần đầu) Tôi đã đi thêm một bước nữa (cảm ơn!), Nhưng hy vọng bạn có thể giải thích kết quả: Tôi thấy rằng quá trình 'WebDev.WebServer20.exe' muốn truy cập vào ** native C++ DLL và ** các DLL VC++ lõi (msvcr80.dll, mfc80.dll, msvcm80.dll, ...) ** không nằm trong thư mục triển khai, nhưng trong các thư mục của biến môi trường 'PATH'. Bây giờ có thể thuyết phục ứng dụng ASP.NET của các DLL trong thư mục triển khai của nó cũng như các tệp lõi VC++ được triển khai trong 'C: \ Windows \ winsxs'? Triển khai nên dễ dàng này ... – Matthias

5

ProcMon cứu tôi.

Con đường cũng là vấn đề của tôi. Dường như IIS đang tạo bản sao bóng của mỗi dll được quản lý trong thư mục C: \ Windows \ System32 \ inetsrv. Nhưng điều này không phải là trường hợp cho mã không được quản lý. Khi nó phải tải một dll không được quản lý, nó tìm kiếm đường dẫn môi trường chứ không phải thư mục bin của ứng dụng trong IIS.

Rất cảm ơn Aristos !!

+0

Nhưng làm cách nào bạn giải quyết vấn đề này? Đã thêm thư mục bin vào PATH? – CrazyMORF

Các vấn đề liên quan