2011-04-02 14 views
5

Ben böyle benim kod ithalat dll ettik:C#: DllImport'ta kullanılan dll'nin tam yolunu nasıl bilebilirim?

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

O fonksiyon çalışır, ancak iç proje değil ve hata ayıklama içinde veya klasörleri bırakın merak edildi. Yani "dll.dll" mevcut proje klasöründe olmadığından mevcut olmamalıdır, ancak kullanılabilir durumdadır. Şimdi, çalışma zamanında kullanılan dll'nin tam yolunu bilmek istiyorum, ancak nasıl alınacağını bilmiyorum. Bu P ile geçerli olmalıdır - Eğer gerçekten öğrenmek istiyorsanız

+3

yararlı olabilir: [dinamik bağlantı kitaplığı arama sırası] (http://msdn.microsoft.com/en-us/library/ms682586%28v=vs.85%29.aspx). Aynı şey P/Invoke ile de geçerli olduğunu düşünüyorum. Ancak, yüklü bir dll dosyasının dosya adını nasıl belirleyeceğini söylemez ;-) –

+1

@pst: Bunu bir yanıt olarak göndermelisiniz çünkü ... cevap budur. –

cevap

7

Win32 API'sini kullanmanız gerekecek.

İlk olarak "dll.dll" dosyasını atlayarak GetModuleHandle kullanın. Ardından bu kolu GetModuleFileName'a aktarın.

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

Hatta 'izlemek' çalışma zamanı içinde uygulama ve böylece hiçbir şey gizli

4

Dynamic-Link Library Search Order Bkz kalır dinamik yükleri algılayabilir kullanmak/Invoke, ancak davranış yük yöntemine bağlı olarak biraz değişebilir. Ancak çalışma zamanında de DLL yolu bulmak için yüklü bir DLL ;-)


Tamamen-un test edilmiş ve belki tedbirsiz çözüm dosya adını nasıl belirleneceği söylemez. Bu, P/Invoke ve LoadLibrary'in aynı çözünürlüğü kullandığını varsayar (örn. P/Invoke, LOAD_WITH_ALTERED_SEARCH_PATH ile LoadLibraryEx kullanmaz) ve bu yaklaşımla ilgili herhangi bir korkunç çakışma yoktur.

  1. Yük LoadLibrary veya LoadLibaryEx ile DLL.

  2. Modülün dosya adını GetModuleFileName kullanarak ve # 1 adımında elde edilen tanıtıcıyı bulun.

  3. Modülü FreeLibrary ile boşaltın. P/ınvoke modülü referans sayımı> 0 tutmalı, ancak yine bu

(yukarıdaki çözüm. Öneriler, uyarılar doğruluğu ve geçerliliği ve/veya yaklaşık garantisi yoktur ;-) test edilmedi düzeltmeler hoş geldiniz. YMMV.)

Mutlu kodlama.

İlgili konular