2012-02-09 39 views
9

में सी ++/सीएलआई घटक के साथ त्रुटि मुझे अपने एएसपी.नेट परियोजनाओं में से एक में एक (प्रबंधित) सी ++/सीएलआई घटक शामिल करना होगा, जो स्वयं के लिए कुछ अन्य (अप्रबंधित) संदर्भ है। सी ++ डीएलएल। कोई समस्या नहीं होनी चाहिए - परियोजना को संकलित करते समय .NET 3.5 खुश है, सबकुछ ठीक लगता है। सी ++/सीएलआई घटक और अन्य सी ++ डीएलएल को विजुअल स्टूडियो 2005 में "किसी भी सीपीयू" के साथ रिलीज संस्करण के रूप में किसी अन्य विभाग द्वारा संकलित किया गया है। वीसी ++ 2005 पुनर्वितरण योग्य पैकेज स्थापित है। और एक ही कोड बिना किसी समस्या के काम करता है जब मैं इसे सामान्य .NET कंसोल एप्लिकेशन के अंदर चलाता हूं।"मॉड्यूल नहीं मिला" एएसपी.NET

अब जबकि इस कोड को एक कंसोल अनुप्रयोग में काम करता है, इसे सही ढंग से ASP.NET द्वारा होस्ट किया जा रहा नहीं कर रहा है - यह (यहां तक ​​कि Global.asax में कदम से पहले) प्रारंभिक पृष्ठ लोड पर एक त्रुटि होता है। परीक्षण और डीबगिंग के लिए, मैं का इस्तेमाल किया है दो मशीन विन्यास:

  1. स्थानीय देव पीसी: Windows XP, 32 बिट, कुलपति ++ 2005 Redist पैकेज, विजुअल स्टूडियो 2010, ASP.NET 3.5, संकलन "कोई भी सीपीयू" , वेब विकास सर्वर में होस्टिंग (कैसिनी)
  2. परीक्षण सर्वर (लक्ष्य मशीन): विंडोज 7, 64 बिट, कुलपति ++ 2005 Redist पैकेज, आईआईएस 7 में होस्टिंग, AppPool "32-बिट अनुप्रयोगों सक्षम करें" है सेट

दोनों मशीनों पर एक ही निम्न त्रुटि तब होती है जब मैं 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 

अब इस अजीब है ... यह नहीं कहता है बारे में कुछ भी क्या विधानसभा याद आ रही है, यहां तक ​​कि Fuslogvw.exe या sxstrace.exe कुछ भी लॉगिंग नहीं कर रहे हैं। कुर्सियों के अलावा ऐसा लगता है कि त्रुटि सी ++/सीएलआई असेंबली या अप्रबंधित सी ++ डीएलएल पर निर्भर करती है। अगर मैं अपने एएसपी.नेट परियोजना और कोड से सी ++/सीएलआई असेंबली संदर्भ हटा देता हूं, तो यह ठीक काम करता है। अब क्योंकि सी ++/सीएलआई असेंबली देशी सी ++ डीएलएल पर निर्भर करता है जिसे एएसपी.नेट परियोजना में संदर्भित नहीं किया गया है, मैंने एएसपी.NET प्रोजेक्ट के आउटपुट फ़ोल्डर के "बिन" फ़ोल्डर में सभी आश्रित सी ++ डीएलएल की प्रतिलिपि बनाई है (वर्कजिन कंसोल के लिए आवेदन)। जबकि प्रत्येक सी ++ सामान को रिलीज मोड में संकलित किया गया है, सही वीसी ++ रेडिस्ट पैकेज स्थापित होने के साथ, सभी निर्भरताओं को जगह में होना चाहिए। बेशक मुझे पता है कि FileNotFoundException है, लेकिन मैं क्या काम कर रहा हूं, यह काम नहीं कर सकता ...

जैसा कि कहा गया है: सी ++/सीएलआई घटक तक पहुंचने के लिए एक ही कोड दोनों टेस्ट पीसी पर .NET 3.5 कंसोल एप्लिकेशन में काम करता है (जहां मेरे पास समान निर्भरताएं तैनात हैं) आउटपुट फ़ोल्डर में तैनात एक ही निर्भर सी ++ डीएलएल के साथ, केवल एएसपी.नेट में मुझे उपरोक्त त्रुटि मिलती है।

कोई सुझाव मैं समस्या से कैसे छुटकारा पा सकता हूं या मैं इसे कैसे ट्रैक कर सकता हूं?

(बेशक मैं इस समस्या के लिए StackOverflow और गूगल खोज की है, उदाहरण के लिए मैं इन कड़ियों पाया, लेकिन वे मदद नहीं की:
-"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)

उत्तर

4

आपका कोड _nLoad तक पहुंच गया है और यह अच्छा है क्योंकि लोडिंग के लिए सभी चेक पास कर चुके हैं और वास्तव में डीएल लोड करने के लिए कोर पर जाते हैं, और वहां असफल हो जाता है।

Dependency Walker http://www.dependencywalker.com/ से शुरू करने के लिए डाउनलोड करें और डीएल पर इसका उपयोग यह पता लगाने के लिए करें कि इस डीएल को किस अन्य संसाधन को चलाने की आवश्यकता है। मुझे संदेह है कि कुछ अन्य डीएलएल फाइल लोड नहीं कर सकते हैं।

अतिरिक्त हो सकता है कि यह डीएल अन्य फाइलों के लिए खोज करे जो नहीं मिल पा रहे हैं और यही लोड क्यों नहीं हो सकता है। दूसरा तरीका File Monitor, या Process Monitor को sysinternals से लोड करने में विफल होने के लिए उपयोग करना है।

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

+0

पहले धन्यवाद। मैंने बिना किसी समस्या के पहले निर्भरता वॉकर का उपयोग किया है। मुझे आश्चर्य है कि एक ही तैनात असेंबली के साथ .NET कंसोल एप्लिकेशन क्यों काम करता है, जबकि एएसपी.नेट आवेदन विफल रहता है? यह अजीब है ... – Matthias

+0

@ माथियास जैसा कि मैं लिखता हूं, शायद इसलिए कि कुछ संसाधन फ़ाइलों को लोड करने में विफल रहता है। उन्हें खोजने के लिए फ़ाइल मॉनीटर का भी उपयोग करें। – Aristos

+0

ठीक है, ProcMon (पहली बार उपयोगकर्ता) के साथ मैं एक कदम आगे चला गया (धन्यवाद!), लेकिन उम्मीद है कि आप परिणामों को समझा सकते हैं: मैंने देखा कि 'WebDev.WebServer20.exe' प्रक्रिया ** मूल C++ तक पहुंच बनाना चाहता है डीएलएल ** और ** कोर वीसी ++ डीएलएल (msvcr80.dll, mfc80.dll, msvcm80.dll, ...) ** तैनाती फ़ोल्डर में नहीं, बल्कि 'पथ' पर्यावरण परिवर्तक के फ़ोल्डर्स में। अब डीएलएल के एएसपी.NET एप्लिकेशन को अपने परिनियोजन फ़ोल्डर में और वीसी ++ कोर फाइलों को 'सी: \ विंडोज \ winsxs' में तैनात किया गया है? परिनियोजन यह आसान होना चाहिए ... – Matthias

5

ProcMon मुझे बचा लिया।

पथ भी मेरी समस्या थी। ऐसा लगता है कि आईआईएस सी: \ विंडोज \ System32 \ inetsrv फ़ोल्डर में प्रत्येक प्रबंधित डीएल की एक छाया प्रति बना रहा है। लेकिन यह अप्रबंधित कोड के मामले में नहीं है। जब इसे एक अप्रबंधित डीएलएल लोड करना होता है, तो यह पर्यावरण पथ को खोजता है, न कि आईआईएस में आवेदन की बिन निर्देशिका।

बहुत धन्यवाद अरिस्टोस !!

+0

पर आपने इस समस्या को कैसे हल किया? पाथ में बिन फ़ोल्डर जोड़ा गया? – CrazyMORF

संबंधित मुद्दे