2016-04-12 41 views
0

Önce durumumu açıklayacağım. Benim için bir kara kutu olan bir DLL kitaplığı var. Hangi dilde yazıldığından emin değilim. Benim tahminim C++ veya hatta C, ama bilmiyorum. Ama ben DLL işlevleri biliyorum, bu yüzden nasıl kullanılacağını biliyorum.C# Dll statik ve dinamik bağlama

Tamam. İşletmelere doğru. Yukarıda sözü edilen DLL ile çalışacak olan C# .NET'i yazıyorum. Tüm yöntemleri bana bağlantı yöntemleri denedim ama sadece bir çalışma:

  • Statik: [DllImport("myDll.dll")] - Bu çalışır.
  • Dinamik: Kernel32.dll tarafından YüklemeLibrary/FreeLibrary - 126 - The specified module could not be found koduyla istisna yapıyorum. Bu sorun eksik bağımlılık içinde yatıyor.
  • Dinamik: Yansıma - Assembly.LoadFile (aPathFileName) kullanırken, istisna yapıyorum: The module was expected to contain an assembly manifest.

Sorunum, bir çeşit yapılandırma dosyasında kara kutuma dll yolunu belirtmem gerektiğidir. Şimdi ne yapabilirim diye bir ipucu isteyebilir miyim, bu sorunu nasıl çözebilirim? Daha spesifik: Yapılandırma dosyasından dize yüklemenin ve sabit bir dizgeyi doldurmak için statik yolla DllImport (const string path); ya da bilmiyorum dinamik bağlantı dll başka yolu var mı? i kullanamaz yöntemlere bu soruya referans Hem cevaplar: Başka bir soruya olası kopya etmek

DÜZENLEME

Cevap. Dediğim gibi, LoadLibrary (exception 126) kullanamıyorum ve aynı zamanda hardcoded olası yolları yağmalayamıyorum (config dosyasından yükleme yoluna ihtiyaç duyduğumu söyledim)

+0

Bu diğer gönderi işe yarayabilir! Ben kernel32.dll SetDllDirectory çağırmak ve statik DllImport tarafından bağlı benim kara kutu dll yöntemini çağırmadan önce, config dosyasından yolunu doldurun! Denerim ve uygun cevabı yazarım. – user1916778

cevap

0

Sinatr, this sorusuna bağlantı gönderdi. Cody Gray ilginç bir çözüm verdi. Dll için Statik DllImport hedef yolu kernel32.dll SetDllDirectory tarafından geçersiz kılabilir. yapmam gereken tek şey bu çekirdek fonksiyonu

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
static extern bool SetDllDirectory(string lpPathName); 

çağırmak Ve sonra hedef dll işlevinin ilk kullanımdan ÖNCE benim yapılandırma dosyasına kaydedilir yolu ile doldurmak oldu. (: \ Klasör \ name.dll gibi c) dll adı ile değil tam yol: Hedef dll (\ klasör c gibi) mevcut olduğu

SetDllDirectory(Settings.Default.dllPath); 

Önemli klasöre SADECE yolu SetDllDirectory için ayarlamaktır.