Không thể tải DLL (Không tìm thấy mô-đun HRESULT: 0x8007007E)


113

Tôi có thư viện dll với mã API C ++ không được quản lý mà tôi cần sử dụng trong ứng dụng .NET 4.0 của mình. Nhưng mọi phương pháp tôi cố gắng tải dll của mình đều gặp lỗi:

Không thể tải DLL 'MyOwn.dll': Không thể tìm thấy mô-đun được chỉ định. (Ngoại lệ từ HRESULT: 0x8007007E)

Tôi đã đọc và thử các giải pháp tôi đã tìm thấy trên internet. Không có gì hoạt động ..

Tôi đã thử sử dụng các phương pháp sau:

[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);

Khi tôi thử làm theo bài viết này và khi tôi chạy ví dụ này (từ mã đã tải xuống), nó chạy mà không có vấn đề gì (dll được sử dụng nằm trong thư mục bin / debug)

Tôi đã sao chép dll của mình (cùng với tất cả các tệp mà nó phụ thuộc vào thư mục bin của tôi).

Tôi cũng đã thử phương pháp này nhưng gặp lỗi tương tự:

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

Bất kỳ đề xuất?

Câu trả lời:


90

Từ những gì tôi nhớ trên Windows, thứ tự tìm kiếm cho một dll là:

  1. Thư mục hiện tại
  2. Thư mục hệ thống, C:\windows\system32 or c:\windows\SysWOW64(dành cho quy trình 32-bit trên hộp 64-bit).
  3. Đọc từ Pathbiến môi trường

Ngoài ra, tôi sẽ kiểm tra các phần phụ thuộc của DLL, trình đi bộ phụ thuộc được cung cấp với Visual Studio có thể giúp bạn tại đây, nó cũng có thể được tải xuống miễn phí: http://www.dependencywalker.com


4
tìm thấy một số phụ thuộc bị thiếu (Oracle và một số dll từ IE). Cần phải cài đặt Oracle từ dll của tôi phụ thuộc vào that..then tôi sẽ biết :) Tìm thấy vấn đề với DependencyWalker;)
Ingimar Andresson

Đừng lo lắng, nó đã tiết kiệm được nhiều giờ vò đầu cho tôi, công cụ nhỏ tuyệt vời! :-)
display101

1
+1 cho Keith Halligan vì đề xuất DependencyWalker. Nó nói với tôi rằng không phải tất cả các phụ thuộc đều có cùng loại CPU (x86 / x64). Tôi đã sao chép tất cả các tệp có cùng loại CPU vào thư mục bin của ứng dụng của mình và điều đó đã giải quyết được sự cố.
DiligentKarma

6
Mọi dll tôi có thể tìm thấy trên hệ thống của mình đều có DependencyWalker tuyên bố rằng có lỗi với các loại CPU khác nhau - ngay cả System.Web.Mvc.dll. Có một số loại báo động giả ở đây.
PandaWood

2
Trong trường hợp của tôi, sự cố đang cố gắng tải C ++ DLL được biên dịch để gỡ lỗi. Điều đó cần thời gian chạy gỡ lỗi C ++, có nghĩa là bạn phải cài đặt Visual Studio. Hoặc biên dịch lại DLL cho Bản phát hành và cài đặt bản phân phối thời gian chạy C ++.
RenniePet

42

Bạn có thể sử dụng công cụ dumpbin để tìm ra các phụ thuộc DLL được yêu cầu:

dumpbin /DEPENDENTS my.dll

Điều này sẽ cho bạn biết DLL nào mà DLL của bạn cần tải. Đặc biệt chú ý đến MSVCR * .dll. Tôi đã thấy mã lỗi của bạn xảy ra khi Visual C ++ Redistributable đúng không được cài đặt.

Bạn có thể tải xuống "Visual C ++ Redistributable Packages for Visual Studio 2013" từ trang web của Microsoft. Nó cài đặt c: \ windows \ system32 \ MSVCR120.dll

Trong tên tệp, 120 = 12.0 = Visual Studio 2013.

Hãy cẩn thận rằng bạn có phiên bản Visual Studio phù hợp (10.0 = VS 10, 11 = VS 2012, 12.0 = VS 2013 ...) đúng kiến ​​trúc (x64 hoặc x86) cho nền tảng đích DLL của bạn và bạn cũng cần phải cẩn thận xung quanh gỡ lỗi các bản dựng. Bản dựng gỡ lỗi của một DLL phụ thuộc vào MSVCR120d.dll là phiên bản gỡ lỗi của thư viện, được cài đặt bằng Visual Studio nhưng không phải bằng Gói có thể phân phối lại.


5
thêm VS C ++ redistributables là nó cho tôi! cần thiết v10.0 (2010). Cảm ơn mucho !!!
Thiago Silva

Có cách nào để biết liệu phiên bản 64-bit hay 32-bit của các tệp phân phối lại được yêu cầu không?
BVB

1
dumpbin / ALL sẽ cho bạn biết liệu my.dll có phải là x86 của x64 hay không
Anthony Hayward

1
Đối với những người vẫn gặp phải vấn đề này, nếu bạn sử dụng debugnhị phân, phiên bản phân phối lại thời gian chạy C ++ cần phải chính xác giống như nơi bạn đã xây dựng nó.
skyline75489

Bình luận của @ skyline75489 đã lưu lại một ngày cho tôi. Thư viện C ++ hoạt động tốt trên máy của tôi nhưng không tải được ở mọi nơi khác do VS liên kết nó với phiên bản gỡ lỗi của msvcr.
điệp viên

14

Đây là một 'k bùn' nhưng ít nhất bạn có thể sử dụng nó để kiểm tra sự tỉnh táo: Hãy thử mã hóa cứng đường dẫn đến DLL trong mã của bạn

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

Có nói rằng; trong trường hợp của tôi, việc chạy dumpbin /DEPENDENTStheo đề xuất của @ anthony-hayward và sao chép các phiên bản 32-bit của DLL được liệt kê ở đó vào thư mục làm việc của tôi đã giải quyết được vấn đề này cho tôi.

Thông báo chỉ hơi gây hiểu lầm, vì nó không phải là dll "của tôi" không thể tải được - đó là phần phụ thuộc


12

DLL phải ở trong thư mục bin.

Trong Visual Studio, tôi thêm dll vào dự án của mình (KHÔNG phải trong Tài liệu tham khảo, mà là "Thêm tệp hiện có"). Sau đó đặt Thuộc tính "Sao chép vào Thư mục đầu ra" cho dll thành "Sao chép nếu mới hơn".


11

Cố gắng nhập đường dẫn đầy đủ của dll. Nếu nó không hoạt động, hãy thử sao chép dll vào thư mục system32.


3
có ổn không khi có tất cả phụ thuộc trong thư mục System32 và dll của tôi ở một nơi khác?
Ingimar Andresson

Sự phụ thuộc cũng sẽ được tìm kiếm theo thứ tự đường dẫn tìm kiếm dll của windows như được chỉ định bởi stackoverflow.com/a/9003290/4434329

4

Đảm bảo rằng tất cả các phụ thuộc của dll của riêng bạn hiện diện gần dll hoặc trong System32.


4

Có một điều rất buồn cười (và có liên quan đến kỹ thuật) có thể làm lãng phí hàng giờ của bạn nên hãy nghĩ đến việc chia sẻ nó ở đây -

Tôi đã tạo một dự án ứng dụng bảng điều khiển ConsoleApplication1và một dự án thư viện lớp ClassLibrary1.

Tất cả mã tạo ra lệnh gọi p / đều có trong ClassLibrary1.dll. Vì vậy, trước khi gỡ lỗi ứng dụng từ visual studio, tôi chỉ cần sao chép C ++ unmanaged assembly ( myUnmanagedFunctions.dll) vào \bin\debug\thư mục của ClassLibrary1dự án để nó có thể được tải vào lúc chạy bởi CLR.

Tôi tiếp tục nhận được

Không thể tải DLL

lỗi trong nhiều giờ. Sau đó, tôi nhận ra rằng tất cả các hội đồng không được quản lý như vậy sẽ được tải cần phải được sao chép vào \bin\debugthư mục của dự án ConsoleApplication1khởi động, thường là một biểu mẫu win, bảng điều khiển hoặc ứng dụng web.

Vì vậy, hãy thận trọng, Current Directorytrong câu trả lời được chấp nhận thực sự có nghĩa là Current Directorytệp thực thi chính từ nơi quá trình đăng ký của bạn đang bắt đầu. Có vẻ như một điều hiển nhiên nhưng đôi khi có thể không phải như vậy.

Bài học rút ra - Luôn đặt các dll chưa được quản lý trong cùng thư mục với tệp thực thi khởi động để đảm bảo rằng nó có thể được tìm thấy.


Điều này đã cố định cho tôi quá. Tuy nhiên, cảm thấy hơi kỳ lạ khi đặt các tệp DLL vào dự án chính thay vì dự án đang thực sự sử dụng chúng ...
Sean Duggan

@SeanDuggan đó là bởi vì nó là một "thư viện liên kết động" có nghĩa là nó được sử dụng (tải) tại thời điểm chạy trái ngược với các thư viện tĩnh được sử dụng tại thời điểm liên kết.
m4l490n

Tôi đã thử thêm dll vào bin\Debugobj\Debugcác thư mục và tôi tiếp tục nhận được "Unable to DLL load"
m4l490n

3

Bật ghi nhật ký hợp nhất, xem câu hỏi này để có nhiều lời khuyên về cách thực hiện điều đó. Gỡ lỗi các vấn đề tải ứng dụng ở chế độ hỗn hợp có thể là một vấn đề nan giải. Ghi nhật ký hợp nhất có thể là một trợ giúp lớn.


2

Đảm bảo bạn đặt Mục tiêu nền tảng xây dựng thành x86 hoặc x64 để nó tương thích với DLL của bạn - có thể được biên dịch cho nền tảng 32 bit.


2

Nếu dự án DLL và .NET trong cùng một giải pháp và bạn muốn biên dịch và chạy cả hai lần, bạn có thể nhấp chuột phải vào các thuộc tính của dự án .NET, Tạo sự kiện, sau đó thêm một cái gì đó như sau vào sự kiện Sau xây dựng dòng lệnh:

copy $(SolutionDir)Debug\MyOwn.dll .

Về cơ bản, nó là một dòng DOS và bạn có thể điều chỉnh dựa trên nơi DLL của bạn đang được xây dựng.


2

Tôi đã gặp vấn đề tương tự khi triển khai ứng dụng của mình để kiểm tra PC. Vấn đề là PC phát triển đã msvcp110d.dllmsvcr110d.dll nhưng không phải là máy tính thử nghiệm.

Tôi đã thêm mô-đun hợp nhất "Visual Studio C ++ 11.0 DebugCRT (x86)" trong InstalledSheild và nó đã hoạt động. Hy vọng điều này sẽ hữu ích cho người khác.


2

Trong trường hợp của tôi, một dll không được quản lý phụ thuộc vào một dll khác bị thiếu. Trong trường hợp đó, lỗi sẽ trỏ đến dll hiện có thay vì thiếu một tệp có thể thực sự gây nhầm lẫn.

Đó chính xác là những gì đã xảy ra trong trường hợp của tôi. Hy vọng điều này sẽ giúp người khác.


1

Tôi nghĩ rằng thư viện không được quản lý của bạn cần một tệp kê khai.
Đây là cách thêm nó vào tệp nhị phân của bạn. và ở đây là lý do tại sao.

Tóm lại, một số phiên bản thư viện Có thể phân phối lại có thể được cài đặt trong hộp của bạn nhưng chỉ một trong số chúng phải đáp ứng Ứng dụng của bạn và nó có thể không phải là phiên bản mặc định, vì vậy bạn cần cho hệ thống biết phiên bản mà thư viện của bạn cần, đó là lý do tại sao tệp kê khai.


1

Thiết lập : Windows 7 32-bit

Bối cảnh : Đã cài đặt trình điều khiển PCI-GPIB mà tôi không thể giao tiếp do sự cố nói trên.

Câu trả lời ngắn gọn : Cài đặt lại trình điều khiển.

Câu trả lời dài : Tôi cũng đã sử dụng Dependency Walker , xác định một số mô-đun phụ thuộc bị thiếu. Ngay lập tức, tôi nghĩ rằng đó phải là một cài đặt trình điều khiển bị lỗi. Tôi không muốn kiểm tra và khôi phục từng tệp bị thiếu.

Thực tế là tôi không thể tìm thấy trình gỡ cài đặt trong Chương trình và Tính năng của Bảng điều khiển là một dấu hiệu khác của cài đặt không tốt. Tôi đã phải xóa thủ công một vài * .dll trong \ system32 và khóa đăng ký để cho phép cài đặt lại trình điều khiển.

Sự cố đã được khắc phục.

Phần bất ngờ là không phải tất cả các mô-đun phụ thuộc đều được giải quyết. Tuy nhiên, * .dll quan tâm hiện có thể được tham chiếu.


1

Tôi đã gặp phải vấn đề tương tự, Trong trường hợp của tôi, tôi có hai chiếc 32 bit. Một cái đã được cài đặt .NET4.5 và một cái khác là PC mới.

cpp dll 32-bit của tôi (Bản dựng chế độ phát hành) hoạt động tốt với PC cài đặt .NET nhưng Không ổn với PC mới, nơi tôi gặp lỗi dưới đây

Không thể tải DLL 'PrinterSettings.dll': Không thể tìm thấy mô-đun được chỉ định. (Ngoại lệ từ HRESULT: 0x8007007E)

cuối cùng,

Tôi vừa xây dựng dự án của mình ở cấu hình chế độ Gỡ lỗi và lần này dll cpp của tôi hoạt động tốt.


0

Cũng gặp phải vấn đề tương tự khi sử dụng tệp dll c / c ++ không được quản lý trong môi trường c #.

1.Kiểm tra khả năng tương thích của dll với CPU 32bit hoặc 64bit.

2. Kiểm tra đường dẫn chính xác của thư mục DLL .bin, system32 / sysWOW64 hoặc đường dẫn đã cho.

3. Kiểm tra xem các tệp PDB (Cơ sở dữ liệu chương trình) có bị thiếu hay không. Video này cung cấp cho bạn điều kiện tốt nhất về tệp pdb.

Khi chạy mã nhị phân C / C ++ 32-bit trong hệ thống 64 bit, điều này có thể phát sinh do không tương thích nền tảng. Bạn có thể thay đổi nó từ Xây dựng> Trình quản lý cấu hình.


0

Tôi gặp phải vấn đề tương tự khi nhập C ++ Dll trong .Net Framework +4, tôi đã bỏ chọn Dự án-> Thuộc tính-> Xây dựng-> Thích 32-bit và nó đã giải quyết được cho tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.