DLL yüklenemiyor (Modül bulunamadı HRESULT: 0x8007007E)


113

.NET 4.0 uygulamamda kullanmam gereken yönetilmeyen C ++ API kodlu dll kitaplığım var. Ancak dll'mi yüklemeye çalıştığım her yöntemde bir hata alıyorum:

DLL 'MyOwn.dll' yüklenemiyor: Belirtilen modül bulunamadı. (HRESULT istisnası: 0x8007007E)

İnternette bulduğum severa çözümlerini okudum ve denedim. Hiç birşey çalışmıyor..

Aşağıdaki yöntemleri kullanmayı denedim:

[DllImport("MyOwn.dll",  CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs((UnmanagedType.I4))]
public static extern Int32 MyProIni(string DBname, string DBuser_pass,
    string WorkDirectory, ref StringBuilder ErrorMessage);

Bu makaleyi takip etmeyi denediğimde ve bu örneği çalıştırdığımda (indirilen koddan) sorunsuz çalışıyor (kullanılan dll, bin / debug klasöründe)

DLL'mi kopyaladım (bağlı olduğu tüm dosyalarla birlikte bin klasörüme).

Ben de bu yaklaşımı denedim ama aynı hatayı aldım:

[DllImportAttribute(MyOwnLibDllPath, EntryPoint="TMproIni")]
[return: MarshalAs(UnmanagedType.I4)]
public static extern  int MyproIni(string DBname, string DBuser_pass, 
    string WorkDirectory, ref StringBuilder ErrorMessage);

Baska öneri?

Yanıtlar:


90

Windows'ta bir dll için arama sırası hatırladığım kadarıyla:

  1. Mevcut Dizin
  2. Sistem klasörü C:\windows\system32 or c:\windows\SysWOW64(64 bitlik kutuda 32 bit işlem için).
  3. PathOrtam değişkeninden okuma

Ek olarak DLL'nin bağımlılıklarını da kontrol ettim, Visual Studio ile sağlanan bağımlılık gezgini burada size yardımcı olabilir, ayrıca ücretsiz olarak indirilebilir: http://www.dependencywalker.com


4
bazı bağımlılıkların eksik olduğunu buldu (Oracle ve IE'den bazı dll). Benim dll'm buna bağlı olduğundan Oracle'ı kurmalıyım ... o zaman bileceğim :) Sorunu DependencyWalker ile
buldum

Endişeye gerek yok, benim için saatler süren kafamı tırmalamaktan kurtuldu, harika küçük araç! :-)
display101

1
DependencyWalker'ı önerdiği için Keith Halligan'a +1. Bana tüm bağımlılıkların aynı CPU tipine (x86 / x64) sahip olmadığını söyledi. Aynı CPU türüne sahip tüm dosyaları uygulamamın bin klasörüne kopyaladım ve bu da sorunu çözdü.
DiligentKarma

6
Sistemimde bulabildiğim her dll'de DependencyWalker, farklı CPU türlerinde bir hata olduğunu iddia ediyor - System.Web.Mvc.dll bile. Burada bir çeşit yanlış alarm var.
PandaWood

2
Benim durumumda sorun, Hata Ayıklama için derlenmiş bir C ++ DLL yüklemeye çalışıyordu. Bu, C ++ hata ayıklama çalışma zamanına ihtiyaç duyar, bu da Visual Studio'yu yüklemeniz gerektiği anlamına gelir. Veya Sürüm için DLL'yi yeniden derleyin ve dağıtılabilir C ++ çalışma zamanını yükleyin.
RenniePet

42

Gerekli DLL bağımlılıklarını bulmak için dumpbin aracını kullanabilirsiniz:

dumpbin /DEPENDENTS my.dll

Bu size DLL dosyanızın yüklenmesi gereken DLL'leri söyleyecektir. Özellikle MSVCR * .dll'ye dikkat edin. Doğru Visual C ++ Yeniden Dağıtılabilir yüklü olmadığında hata kodunuzun oluştuğunu gördüm.

Microsoft web sitesinden "Visual Studio 2013 için Visual C ++ Yeniden Dağıtılabilir Paketleri" edinebilirsiniz. C: \ windows \ system32 \ MSVCR120.dll dosyasını yükler

Dosya adında, 120 = 12.0 = Visual Studio 2013.

DLL'nizin hedef platformu için doğru Visual Studio sürümüne (10.0 = VS 10, 11 = VS 2012, 12.0 = VS 2013 ...) doğru mimariye (x64 veya x86) sahip olduğunuza ve ayrıca dikkatli olmanız gerektiğine dikkat edin. hata ayıklama yapıları. Bir DLL'nin hata ayıklama derlemesi, kitaplığın hata ayıklama sürümü olan MSVCR120d.dll'ye bağlıdır; bu, Visual Studio ile yüklenir, ancak Yeniden Dağıtılabilir Paketi tarafından yüklenmez.


5
VS C ++ yeniden dağıtılabilirlerini eklemek benim için buydu! v10.0 (2010) gerekli. Çok teşekkürler !!!
Thiago Silva

Yeniden dağıtılabilirlerin 64-bit veya 32-bit sürümlerinin gerekli olup olmadığını anlamanın bir yolu var mı?
BVB

1
dumpbin / ALL, my.dll dosyasının x64 x86 olup olmadığını söyleyecektir
Anthony Hayward 15

1
Hala bu sorundan muzdarip olanlar için, debugikili kullanıyorsanız , C ++ çalışma zamanı yeniden dağıtılabilir sürümünün, onu oluşturduğunuz yerle tamamen aynı olması gerekir.
ufuk çizgisi75489

@ skyline75489'un yorumu günü benim için kurtardı. C ++ kitaplığı makinemde gayet iyi çalıştı, ancak VS'nin msvcr'nin hata ayıklama sürümüne bağlanması nedeniyle başka her yerde yüklenemedi.
casusluk yap

14

Bu bir 'kludge' ama en azından bunu akıl sağlığı testi için kullanabilirsiniz: Kodunuzda DLL yolunu sabit kodlamayı deneyin

[DllImport(@"C:\\mycompany\\MyDLL.dll")]

Bunu söyledikten sonra; benim durumumda dumpbin /DEPENDENTS@ anthony-hayward tarafından önerildiği gibi çalıştırmak ve orada listelenen DLL'lerin 32 bitlik sürümlerini çalışma dizinime kopyalamak benim için bu sorunu çözdü.

Mesaj biraz yanıltıcıdır, çünkü yüklenemeyen "benim" dll değil - bağımlılıklardır


12

DLL'nin bin klasöründe olması gerekir.

Visual Studio'da dll'yi projeme ekliyorum (Referanslar'da DEĞİL, "Mevcut dosyayı ekle"). Ardından dll için "Çıktı Dizinine Kopyala" Özelliğini "Daha yeniyse kopyala" olarak ayarlayın.



4

Kendi dll'nizin tüm bağımlılıklarının dll'nin yanında veya içinde bulunduğundan emin olun System32.


4

Saatlerinizi boşa harcayabilecek çok komik (ve teknik bir ilgisi olan) bir şey var, bu yüzden burada paylaşmayı düşünün -

Bir konsol uygulaması projesi ConsoleApplication1ve bir sınıf kitaplığı projesi oluşturdum ClassLibrary1.

P / invoke'u oluşturan tüm kod içinde mevcuttu ClassLibrary1.dll. Bu yüzden, görsel stüdyodan uygulamada hata ayıklamadan önce , CLR tarafından çalışma zamanında yüklenebilmesi için C ++ unmanaged assembly ( myUnmanagedFunctions.dll) 'yi proje \bin\debug\dizinine kopyaladım ClassLibrary1.

Almaya devam ettim

DLL yüklenemiyor

saatlerce hata. Daha sonra, yüklenecek tüm bu tür yönetilmeyen derlemelerin , genellikle bir kazanma formu, konsol veya web uygulaması olan \bin\debugbaşlangıç ​​projesinin dizinine kopyalanması gerektiğini fark ettim ConsoleApplication1.

Bu nedenle, lütfen Current Directorykabul edilen yanıtta Current Directory, başvuru işleminizin başladığı yerden asıl yürütülebilir dosyanın anlamına geldiğine dikkat edin . Bariz bir şeye benziyor ama bazen öyle olmayabilir.

Ders Öğrenildi - Yönetilmeyen dll'leri, bulunabilmesini sağlamak için her zaman başlangıç ​​yürütülebilir dosyasıyla aynı dizine yerleştirin.


Bu benim için de işleri düzeltti. DLL'leri aslında onları kullanan proje yerine ana projeye koymak biraz tuhaf geliyor ...
Sean Duggan

@SeanDuggan, bunun nedeni "dinamik bağlantı kitaplığı" olması, bağlama zamanında kullanılan statik kitaplıkların aksine çalışma zamanında kullanıldığı (yüklendiği) anlamına gelir.
m4l490n

bin\Debugobj\Debug
Dll'yi

3

Füzyon kaydını açın, bunun nasıl yapılacağına dair birçok tavsiye için bu soruya bakın . Karışık mod uygulamaları yükleme sorunlarının hatalarını ayıklamak çok ciddi bir acı olabilir. Füzyon günlük kaydı büyük bir yardımcı olabilir.


2

Build Platform Target'ı x86 veya x64 olarak ayarladığınızdan emin olun, böylece 32 bitlik bir platform için derlenmiş olabilir.


2

DLL ve .NET projeleri aynı çözümdeyse ve her ikisini de derlemek ve çalıştırmak istiyorsanız, .NET projesinin özelliklerine sağ tıklayabilir, Yapı olayları yapabilir ve ardından Post-build olayına aşağıdakine benzer bir şey ekleyebilirsiniz. Komut satırı:

copy $(SolutionDir)Debug\MyOwn.dll .

Temelde bir DOS hattıdır ve DLL dosyanızın oluşturulduğu yere göre ince ayar yapabilirsiniz.


2

PC'yi test etmek için uygulamamı dağıttığımda da aynı sorunu yaşadım. Sorun, PC'nin sahip olduğu msvcp110d.dll, msvcr110d.dllancak test bilgisayarının geliştirilmesiydi.

InstalledSheild'e "Visual Studio C ++ 11.0 DebugCRT (x86)" birleştirme modülünü ekledim ve çalıştı. Umarım bu başkası için yararlı olur.


2

Benim durumumda, bir yönetilmeyen dll eksik olan diğerine bağlıydı. Bu durumda hata, eksik olan yerine mevcut dll'yi gösterecektir ve bu gerçekten kafa karıştırıcı olabilir.

Benim durumumda olan tam olarak buydu. Umarım bu başka birine yardımcı olur.


1

Sanırım yönetilmeyen kütüphanenizin bir bildiriye ihtiyacı var. Bunu ikili dosyanıza nasıl ekleyeceğiniz
aşağıda açıklanmıştır . ve işte nedeni.

Özetle, kutunuza birkaç Yeniden Dağıtılabilir kitaplık sürümü yüklenebilir, ancak bunlardan yalnızca biri Uygulamanızı tatmin etmelidir ve bu varsayılan olmayabilir, bu nedenle sisteme kitaplığınızın ihtiyaç duyduğu sürümü söylemeniz gerekir, bu nedenle bildirim.


1

Kurulum : 32 bit Windows 7

Bağlam : Yukarıda belirtilen sorun nedeniyle iletişim kuramadığım bir PCI-GPIB sürücüsü kurdum.

Kısa Cevap : Sürücüyü yeniden yükleyin.

Uzun Cevap : Birkaç eksik bağımlılık modülünü tanımlayan Dependency Walker'ı da kullandım . Hemen, başarısız bir sürücü kurulumu olması gerektiğini düşündüm. Her eksik dosyayı kontrol etmek ve geri yüklemek istemedim.

Kaldırıcıyı Kontrol Panelinin Programlar ve Özellikleri altında bulamadığım gerçeği, kötü kurulumun bir başka göstergesidir. Sürücünün yeniden yüklenmesine izin vermek için \ system32'deki birkaç * .dll ve kayıt defteri anahtarını manuel olarak silmem gerekiyordu.

Sorun düzeltildi.

Beklenmeyen kısım, tüm bağımlılık modüllerinin çözülmemiş olmasıydı. Bununla birlikte, ilgilenilen * .dll dosyasına artık başvurulabilir.


1

Aynı problemle karşılaştım, benim durumumda iki adet 32 ​​bit bilgisayarım vardı. Biri .NET4.5 yüklü, diğeri yeni bilgisayardı.

32-bit cpp dll'm (Release mode build) .NET yüklü PC ile iyi çalışıyordu, ancak aşağıdaki hatayı aldığım yeni PC ile değil

DLL 'PrinterSettings.dll' yüklenemiyor: Belirtilen modül bulunamadı. (HRESULT istisnası: 0x8007007E)

en sonunda,

Projemi Debug modu konfigürasyonunda oluşturdum ve bu sefer cpp dll'im iyi çalışıyordu.


0

Ayrıca c # ortamında yönetilmeyen c / c ++ dll dosyasını kullanırken de aynı sorunla karşılaştı.

1. dll'nin 32bit veya 64bit CPU ile uyumluluğu kontrol edildi.

2. DLL .bin klasörünün, system32 / sysWOW64 yolunun veya verilen yolun doğru yollarını kontrol edin.

3. PDB (Program Veritabanı) dosyalarının eksik olup olmadığı kontrol edildi. Bu video size pdb dosyaları hakkında en iyi kavrayışı sağlar.

64bit sistemde 32-bit C / C ++ ikili kodu çalıştırırken, platform uyumsuzluğu nedeniyle bu ortaya çıkabilir. Bunu Yapı> Yapılandırma yöneticisinden değiştirebilirsiniz.


0

.Net Framework +4'te C ++ Dll'yi içe aktarırken aynı problemle karşılaştım, Proje-> Özellikler-> Oluştur-> Tercih 32-bit işaretini kaldırdım ve benim için çözüldü.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.