2011-04-02 6 views
5

मुझे लगता है कि जैसे मेरी कोड में आयात dll है:सी #: DllImport में उपयोग किए गए डीएलएल का पूरा पथ कैसे जानें?

[DllImport("dll.dll", CharSet = CharSet.Ansi)] 
    private static extern int function(String pars, StringBuilder err); 

मुझे लगता है कि समारोह में काम करता है, लेकिन यह अंदर परियोजना नहीं है और न डीबग अंदर या फ़ोल्डर रिलीज सोचा था। अर्थात। "dll.dll" availabe नहीं होना चाहिए क्योंकि यह वर्तमान प्रोजेक्ट फ़ोल्डर में नहीं है, हालांकि यह उपलब्ध है। अब मैं रनटाइम पर इस्तेमाल किए गए डीएलएल का सटीक पूरा पथ जानना चाहता हूं, लेकिन यह नहीं पता कि इसे कैसे प्राप्त किया जाए।

+3

यह उपयोगी हो सकता है: [गतिशील लिंक लाइब्रेरी खोज आदेश] (http://msdn.microsoft.com/en-us/library/ms682586%28v=vs.85%29.aspx)। मुझे लगता है कि यह पी/Invoke के साथ सच है। हालांकि यह नहीं कहता कि लोड किए गए डीएलएल के फ़ाइल नाम को कैसे निर्धारित किया जाए ;-) –

+1

@pst: आपको इसे उत्तर के रूप में पोस्ट करना चाहिए क्योंकि ... यह जवाब है। –

उत्तर

7

आपको Win32 API का उपयोग करना होगा।

पहले इसका उपयोग GetModuleHandle "dll.dll" से गुज़रने के लिए करें। फिर GetModuleFileName पर उस हैंडल को पास करें।

string GetDllPath() 
{ 
     const int MAX_PATH = 260; 
     StringBuilder builder = new StringBuilder(MAX_PATH); 
     IntPtr hModule = GetModuleHandle("dll.dll"); // might return IntPtr.Zero until 
                // you call a method in 
                // dll.dll causing it to be 
                // loaded by LoadLibrary 

     Debug.Assert(hModule != IntPtr.Zero); 
     uint size = GetModuleFileName(hModule, builder, builder.Capacity); 
     Debug.Assert(size > 0); 
     return builder.ToString(); // might need to truncate nulls 
} 

    [DllImport("kernel32.dll", CharSet=CharSet.Auto)] 
    public static extern IntPtr GetModuleHandle(string lpModuleName); 

    [DllImport("kernel32.dll", SetLastError=true)] 
    [PreserveSig] 
    public static extern uint GetModuleFileName 
    (
     [In] IntPtr hModule,   
     [Out] StringBuilder lpFilename,   
     [In][MarshalAs(UnmanagedType.U4)] int nSize 
    ); 
1

तुम सच में पता लगाने के लिए चाहते हैं, का उपयोग dependency-walker

यह भी 'की निगरानी' कर सकते हैं क्रम में अपने आवेदन और गतिशील भार का पता लगाने के तो कुछ भी नहीं रहता छिपा

4

Dynamic-Link Library Search Order देखें - यह पी के साथ सच धारण करना चाहिए/आमंत्रित करें, लेकिन लोड विधि के आधार पर व्यवहार थोड़ा बदलाव योग्य है। लेकिन यह कहना नहीं है कि कैसे एक लोड DLL ;-)


एक पूरी तरह से गैर-परीक्षण किया है और शायद बीमार की सलाह दी समाधान के फ़ाइल नाम निर्धारित करने के लिए रन-टाइम पर DLL पथ खोजने के लिए। यह मानता है कि पी/Invoke और LoadLibrary एक ही संकल्प का उपयोग करते हैं (उदा। पी/Invoke लोड LibraryEx का उपयोग LOAD_WITH_ALTERED_SEARCH_PATH के साथ नहीं करता है) और इस दृष्टिकोण के साथ कोई भयानक संघर्ष नहीं है।

  1. लोड LoadLibrary या LoadLibaryEx साथ DLL।

  2. GetModuleFileName और चरण # 1 में प्राप्त हैंडल का उपयोग कर मॉड्यूल का फ़ाइल नाम खोजें।

  3. FreeLibrary के साथ मॉड्यूल को अनलोड करें। पी/आह्वान मॉड्यूल संदर्भ गिनती> 0 रखना चाहिए, लेकिन फिर से, इस अपरीक्षित ;-)

(वहाँ शुद्धता या इसके बाद के संस्करण समाधान। सुझाव, चेतावनी की मान्यता और/या के बारे में कोई गारंटी नहीं है है सुधार स्वागत है। वाईएमएमवी।)

हैप्पी कोडिंग।

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