2011-02-16 20 views
7

मैं इसे वास्तव में क्या वर्णन किया गया है here क्या करना चाहते हैं, लेकिन उसे स्वीकार समाधान मेरे लिए काम नहीं करता है में एक ही DLL के 2 संस्करण। मुझे लगता है कि कारण here समझाया गया है:लोड एक ही प्रक्रिया

निर्भरता के साथ एक DLL एक पूर्ण पथ, सिस्टम DLL के आश्रित DLLs के लिए खोज के रूप में यदि वे अपने मॉड्यूल नाम के साथ लोड किया गया निर्दिष्ट द्वारा भरी हुई है तो।

एक ही मॉड्यूल नाम के साथ एक DLL पहले से ही स्मृति में, केवल चेकों पुनर्निर्देशन के लिए भरी हुई है प्रणाली और एक प्रकट लोड DLL को हल करने, कोई फर्क नहीं पड़ता जो निर्देशिका उस में है पहले। प्रणाली करता है डीएलएल के लिए खोजें नहीं।

मैं निम्नलिखित संरचना में अपना आवेदन करना चाहता हूं।

c:\Exe 
| 
|----- c:\DLL\DLL.dll, c:\DLL\common.dll 
| 
|----- c:\DLL2\DLL2.dll, c:\DLL2\common.dll 

मेरे EXE परोक्ष दोनों ही मामलों में लोड किया जाता है के माध्यम से

LoadLibrary("c:\\DLL\\DLL.dll"); 
LoadLibraryEx("c:\\DLL2\\DLL2.dll"); 

आम DLLs लोड होगा।

मैं SetDllDirectory विकल्प की कोशिश की, लेकिन वहाँ हमेशा सिर्फ एक ही common.dll भरी हुई है।

मैं common.dll में संस्करण जानकारी गयी। c: \ DLL \ common.dll में संस्करण 2.0.1.0 है जबकि c: \ DLL2 \ DLL2.dll संस्करण 4.0.1.0

मैंने निम्न संस्करण को संबंधित संस्करण जानकारी के साथ एम्बेड किया है, लेकिन इससे मदद नहीं मिली।

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity type="win32" name="common" version="4.0.1.0" processorArchitecture="x86"></assemblyIdentity> 
    </dependentAssembly> 
    </dependency> 
</assembly> 

क्या इस समस्या का समाधान है?

उत्तर

6

आपने मैनिफेस्ट को एम्बेड किया है? EXE या DLLs?

आप ऐसा करने के दो बुनियादी तरीके होते हैं, दोनों इसके लिए एक प्रकट बनाने के द्वारा एक निजी SxS विधानसभा में बदल शामिल है "आम"।

तब:

  1. तो DLL और DLL2 निर्भर विधानसभाओं लिस्टिंग प्रकट होते हैं, तो आप उनके प्रकट होता है एक आश्रित विधानसभा के रूप में "acme.common" (उदाहरण के लिए) को निर्दिष्ट करने के लिए एक dependentAssembly जोड़ने की जरूरत है। चूंकि निर्भर असेंबली हमेशा डिफ़ॉल्ट रूप से लोडिंग मॉड्यूल फ़ोल्डर में खोजी जाती हैं, प्रत्येक डीएलएल अपनी स्थानीय प्रतिलिपि सामान्य लोड करेगा।

  2. यदि आप भारी उठाने के लिए अनुप्रयोगों के डिफ़ॉल्ट सक्रियण संदर्भ पर निर्भर हैं, तो आप सक्रियण कॉन्टेक्स्ट एपीआई का उपयोग करने का प्रयास कर सकते हैं। CreateActCtx पर दो बार कॉल करें, परिणामस्वरूप संदर्भ के लिए आधार फ़ोल्डर के रूप में दो अलग-अलग फ़ोल्डरों को निर्दिष्ट करें।

छद्म कोड में:

HACTCTX h1 = CreateActCtx(... for DLL ...); 
HACTCTX h2 = CreateActCtx(... for DLL2 ...); 

ActivateActCtx(h1,...); 
LoadLibrary("C:\\DLL\\DLL1.DLL"); 
DeactivateActCtx(); 
ActivateActCtx(h2,...); 
LoadLibrary("C:\\DLL2\\DLL2.DLL"); 
DeactivateActCtx... 

DLLs पहले से ही अपने स्वयं के प्रकट होते हैं तो प्रणाली उन का उपयोग करेगा। यदि नहीं, तो यह आपको डीएल के स्वयं को संशोधित किए बिना निजी असेंबली के लिए एक खोज निर्देशिका निर्दिष्ट करने देगा। पहले, मैं विधानसभा नाम के रूप में dll नाम का उपयोग करने की कोशिश कर की अनुशंसा नहीं करते:


विकल्प 1 लागू करने के लिए।

<!-- acme.common.manifest --> 
<assembly manifestVersion="1.0"> 
    <assemblyIdentity type="Win32" name="acme.common" version="1.0.0.0" processorArchitecture="x86"/> 
    <file name="common.dll"/> 
</assembly> 

आप प्रत्येक फ़ोल्डर में common.dll के संस्करण से मेल करने के लिए संस्करण संख्या ठीक कर सकते हैं, लेकिन महत्वपूर्ण नहीं thats: तो, एक प्रकट है कि प्रत्येक फ़ोल्डर में इस तरह दिखता पैदा करते हैं।

फिर, या तो प्रकट आप सूची, या इस तरह एक निर्देश आप दृश्य स्टूडियो उपयोग कर रहे हैं

#pragma comment(linker, "/manifestdependency:\"acme.common'"\ 
        " processorArchitecture='*' version='1.0.0.0' type='win32'\"") 

बस सुनिश्चित करें कि निर्भर विधानसभा संस्करणों संगत 'acme.common' विधानसभा के संस्करणों मेल खाती हैं।

+0

धन्यवाद। मैंने डीएलएल में प्रकटताओं को एम्बेड किया। तो, ऐसा लगता है कि मैंने जो किया है वह मैंने किया था। या क्या मुझे कुछ याद आ रही है? क्या मैनिफेस्ट सही है? – PeeWee2201

+0

मैंने विधि 1 पर कुछ स्पष्टीकरण जोड़ा। –

+0

धन्यवाद। मुझे यह काम मिल गया। मुझे विंडोज 7 पर स्विच करना था और यह देखने के लिए एसएक्सएसट्रेस टूल का उपयोग करना था कि क्या हो रहा है। एक बार यह स्थापित हो जाने के बाद, यह काफी आसान है, लेकिन उपकरण के बिना आपके पास गलत क्या है पर कोई दृश्यता नहीं है – PeeWee2201

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