6

का संदर्भ नहीं देता, मैं एक अजीब समस्या में चल रहा हूं। मैंने विंडोज रनटाइम कंपोनेंट (विंडोज स्टोर के लिए) बनाया है जो कुछ सी # रैपर वर्गों के माध्यम से .NET को कुछ विरासत सी/सी ++ कोड उपलब्ध कराता है।WinRT घटक लोड नहीं कर सकता जब तक कि मैं प्रोजेक्ट

मैंने एक टेस्ट हार्नेस स्टोर ऐप लिखा (बाद में इसे "test1" कहा जाता है) जो डब्लूआरसी प्रोजेक्ट (एक ही समाधान में दोनों परियोजनाओं) का संदर्भ देता है। यह घटक में कॉल करता है और सब कुछ ठीक काम करता है।

अगला मैं WRC परियोजना से निम्नलिखित उत्पादन फ़ाइलें ले:

MyWrtComponent.dll 
MyWrtComponent.exp 
MyWrtComponent.pdb 
MyWrtComponent.pri 
MyWrtComponent.winmd 

... और उन्हें किसी अन्य स्टोर एप्लिकेशन परियोजना ("test2") से उपयोग करने के लिए प्रयास करें। इस प्रोजेक्ट में, MyWrtComponent प्रोजेक्ट को संदर्भित करने के बजाय, मैं .winmd फ़ाइल का संदर्भ जोड़ता हूं। सब कुछ ठीक बनाता है, लेकिन जब मैं test2 अनुप्रयोग चलाने मैं जैसे ही मैं सी # MyWrtComponent में लागू वर्गों में से एक का उपयोग करने की कोशिश mscorlib से एक System.IO.FileNotFound अपवाद:

at System.StubHelpers.StubHelpers.GetWinRTFactoryObject(IntPtr pCPCMD) 
at MyWrtComponent.MyWrtClass..ctor() 

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

रिहाई बनाम डिबग का उपयोग करना MyWrtComponent का निर्माण कोई फर्क नहीं पड़ता है।

QueryOpen F:\test2\bin\Debug\AppX\vccorlib120d_app.DLL NAME NOT FOUND 
QueryOpen F:\test2\bin\Debug\AppX\vccorlib120d_app.DLL NAME NOT FOUND 
CreateFile C:\Windows\SysWOW64\vccorlib120d_app.DLL NAME NOT FOUND 

मैंने पुष्टि की है कि इस फाइल मौजूद नहीं है:

test2 पर ProcMon चल रहा है, मैं लोड हो रहा है vccorlib120_app.DLL (या vccorlib120d_app.DLL अगर मैं निर्माण कर रहा हूँ डिबग) पर कई असफल प्रयासों को देखने के मेरे सी में: \ विंडोज \ SysWOW64 फ़ोल्डर। मुझे नहीं पता कि यह मेरी समस्या से प्रासंगिक है या नहीं।

जब मैं test1 चलाने के लिए, अलग-अलग स्थानों की खोज कर रहे हैं, और फ़ाइल पाया जाता है:

QueryOpen F:\test1\bin\Debug\AppX\vccorlib120d_app.DLL NAME NOT FOUND 
CreateFile C:\Program Files\WindowsApps\Microsoft.VCLibs.120.00.Debug_12.0.20827.3_x86__8wekyb3d8bbwe\vccorlib120d_app.dll SUCCESS 

मैं बिन \ दोनों परीक्षण परियोजनाओं के डीबग \ AppxManifest.xml तुलना में, और एक महत्वपूर्ण अंतर पर ध्यान; यह काम करता है मैं test2 के उत्पन्न उत्पादन करने के लिए इन तीन लाइनों को जोड़ने और एप्लिकेशन चलाते हैं

<Dependencies> 
    <PackageDependency Name="Microsoft.VCLibs.120.00.Debug" MinVersion="12.0.20827.3" /> 
</Dependencies> 

,, लेकिन निश्चित रूप से है कि एक असली ठीक नहीं है: test1 निम्नलिखित है और test2 नहीं करता है।

क्या कोई यह समझता है कि यहां क्या हो रहा है? क्या MyWrtComponent की निर्भरता है कि किसी भी तरह से संवाद नहीं किया जा रहा है, या क्या मुझे अपने रनटाइम घटक के साथ vccorlib120d_app.DLL पैकेज करने के लिए कुछ करना है या ...?

अग्रिम धन्यवाद।

उत्तर

14

ठीक है, आप यहां कई मुद्दों पर चल रहे हैं, पहला यह है कि आपके WinRT घटक C++ का उपयोग करते हैं, तो आपको अपने ऐप में माइक्रोसॉफ्ट विजुअल सी ++ रनटाइम पैकेज का संदर्भ होना चाहिए, यह ऐसा कुछ है अपने घटक (ऐप डेवलपर) के अंतिम उपयोगकर्ता द्वारा ऐसा करने के लिए, ऐसा करने के लिए, ऐप के समाधान एक्सप्लोरर में संदर्भ फ़ोल्डर पर राइट क्लिक करें और Windows-> एक्सटेंशन पर जाएं, सूची में माइक्रोसॉफ्ट विजुअल सी ++ रनटाइम पैकेज का चयन करें उपलब्ध एसडीके और ठीक क्लिक करें।

दूसरा, यदि आप अपने लिए इस घटक को रखने की योजना बना रहे हैं, तो बेहतर है कि आप परियोजना को संदर्भित करते हैं क्योंकि यह करने का आसान तरीका है, अगर आप इसे वितरित करने की योजना बनाते हैं, तो आपको यह सुनिश्चित करने के लिए एक एसडीके बनाना होगा कि सभी टुकड़े एक साथ हैं, ध्यान दें कि सी ++ विनरेट घटकों के लिए यह आवश्यक है, लेकिन सी # या वीबी.नेट घटकों के लिए नहीं, ऐसा लगता है कि सी ++ विनरेट घटक मेटाडेटा (विनएमडी फ़ाइल) और कार्यान्वयन (डीएलएल फ़ाइल) में विभाजित हैं, और भले ही आप उन्हें एक तरफ रखते हैं, वे एक-दूसरे को पहचानने में असमर्थ हैं, जबकि सी # और वीबी.नेट में मेटाडेटा और इसका कार्यान्वयन एक ही फ़ाइल (विनएमडी) पर है। यदि आप एक एसडीके बनाना चाहते हैं, तो एमएसडीएन पर this documentation पढ़ें।

4

आपका दूसरा निर्माण ऐप-पैकेज आवश्यकताओं का उल्लंघन कर रहा है। कौन सा राज्य स्टोर में आपके द्वारा प्रदान किए जाने वाले एप्लिकेशन पैकेज में सभी एम्बेडेड निर्भरताओं के हैं और एप्लिकेशन मेनिफेस्ट उन सभी निर्भरताओं को सूचीबद्ध करता है। यह एक मजबूत डीएलएल नरक countermeasure है, एक स्टोर उपयोगकर्ता को आप जिस तरह की समस्या में भाग गए थे उसे हल करने की कोई उम्मीद नहीं है।

.winmd फ़ाइल का संदर्भ जोड़ना संकलक को खुश रखता है, इसमें आपके स्रोत कोड को संकलित करने के लिए पर्याप्त जानकारी होती है। लेकिन अगला कदम गलत हो जाता है, .winmd फ़ाइल ऐप पैकेज को एक साथ रखने के लिए बिल्ड सिस्टम को पर्याप्त जानकारी नहीं देती है। यह केवल .winmd फ़ाइल से नहीं पता लगा सकता है कि आपके घटक में अतिरिक्त निर्भरताएं हैं। आपकी मुख्य परियोजना माइक्रोसॉफ्ट.वीसीएलबीएस पर निर्भरता नहीं है क्योंकि यह एक प्रबंधित परियोजना है।

ऐसा नहीं है कि आप स्वयं को एपक्समैनिफाईस को बनाए रख सकें।यह सिर्फ अतिरिक्त काम है जो गलत होने के लिए बहुत आसान तरीका है, उनके साथ डीबग बनाम रिलीज बिल्ड के लिए अलग होना शुरू होता है। अगला वीएस अपडेट आपको परेशानी में लाने जा रहा है, इसमें कोई संदेह नहीं है कि माइक्रोसॉफ्ट.वीसीलिब्स के लिए एक अपडेट होगा, जिसके लिए आपको मैनिफेस्ट में संस्करण संख्या अपडेट करना होगा।

एक परियोजना संदर्भ का उपयोग करना हमेशा उचित पैकेज प्राप्त करने का एक आसान तरीका है।

+0

मैंने दोनों उत्तरों को उखाड़ फेंक दिया है, लेकिन मुझे बक्षीस के लिए एक चुनना पड़ा, और राफेल के जवाब में विशिष्ट निर्देश थे जो मेरे लिए सहायक थे। धन्यवाद हंस। –

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