Không thể thêm tham chiếu đến dll


95

Khi tôi thêm tệp .dll làm tham chiếu trong ứng dụng C #, nó hiển thị lỗi:

Không thể thêm tham chiếu đến ".... dll". Vui lòng đảm bảo rằng tệp có thể truy cập được và đó là cấu phần hợp lệ hoặc COM.

ILDissassembler cho biết không có tiêu đề CLR hợp lệ vì vậy tôi cố gắng đăng ký nó bằng cách sử dụng regsvr32 và điều đó gây ra cho tôi một lỗi khác:

Mô-đun "" đã được tải nhưng cuộc gọi đến DLLRegisterServer không thành công với mã lỗi '0x80004005'

Tôi đang sử dụng phiên bản cuối cùng của VS2010 trên máy Windows 7 64bit. Điều gì có thể là vấn đề?

Cảm ơn vì bất kỳ gợi ý / trả lời nào

Câu trả lời:


53

Những điều sau đây đã làm việc cho tôi:

Câu trả lời ngắn

Chạy phần sau qua dòng lệnh (cmd):

TlbImp.exe cvextern.dll        //where cvextern.dll is your dll you want to fix.

Và một dll hợp lệ sẽ được tạo cho bạn.

Câu trả lời dài hơn

  • Mở cmd

  • Tìm TlbImp.exe. Có thể nằm trong C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin. Nếu bạn không thể tìm thấy nó, hãy chuyển đến thư mục gốc của bạn (C: \ hoặc D :) và chạy:

    dir tlbimp.exe /s              //this will locate the file.
  • Chạy tlbimp.exe và đặt dll của bạn đằng sau nó. Ví dụ: Nếu dll của bạn là cvextern.dll. Bạn có thể chạy:

    TlbImp.exe cvextern.dll
  • Một dll mới đã được tạo trong cùng một thư mục của tlbimp.exe. Bạn có thể sử dụng nó làm tài liệu tham khảo trong dự án của mình.

5
Một cách khác để truy cập TlbImp.exe là mở dấu nhắc lệnh Visual Studio.
Scott

75
@Memet Afer đang thử cái này mà tôi nhận được, TlbImp : error TI0000 : The input file 'c:\Program Files\Microsoft SDKs\Windows\ v7.0A\bin\MyLibrary.dll' is not a valid type library.Có đề xuất gì không?
Dineshkumar

1
Tệp đầu vào C: \ Windows \ SYSTEM32 \ SqlServerSpatial.dll 'không phải là một thư viện loại hợp lệ
Christine

7
Có cùng một lỗi như đã nêu bởi Dineshkumar Ponnusamy. Xin hãy giúp tôi ra
deathrace

1
Khi nào bạn cần sử dụng TLBMP? Thông thường trong VS2015 nếu bạn chỉ thêm tham chiếu đến COM DLL từ cửa sổ tham chiếu, nó sẽ giải quyết tất cả điều này cho bạn.
UuDdLrLrSs

20

Bạn chỉ có thể thêm DLL (hoặc EXE) vào một dự án nếu nó là một hợp ngữ .NET. Nếu không, bạn sẽ thấy thông báo lỗi này.

regsvr32 cũng đưa ra các giả định nhất định về cấu trúc và chức năng đã xuất trong DLL. Đã được một thời gian kể từ khi tôi sử dụng nó nhưng nó liên quan đến việc đăng ký máy chủ COM nên cần phải có một số điểm nhập nhất định. Nếu regsvr32 không thành công, DLL không cung cấp các điểm nhập đó và DLL không chứa thành phần COM.

Bạn chỉ có cơ hội sử dụng DLL là nhập nó giống như bất kỳ tệp nhị phân không phải .NET nào khác, ví dụ: khi bạn sử dụng một số API Win32. Có một Bài báo trên Tạp chí MSDN cũ có thể hữu ích. Xem bản cập nhật sau để biết thông tin về nơi lấy bài viết.

Cập nhật ngày 12 tháng 3 năm 2018: Liên kết đến Tạp chí MSDN không còn hoạt động như trước đây vào tháng 8 năm 2010. Bài báo của Jason Clark có tiêu đề ".NET Column: Gọi Win32 DLL trong C # với P / Invoke". Nó đã được xuất bản trong số tháng 7 năm 2010 của Tạp chí MSDN. "Wayback Machine" có bài viết ở đây vào lúc này (định dạng bị hạn chế). Toàn bộ Tạp chí MSDN số tháng 7 năm 2010 có tại đây (chỉ định dạng HCM, hướng dẫn cách sử dụng tệp HCM tại đây ).


Có cách nào để đảm bảo trình biên dịch đặt .dll trong thư mục đầu ra ngay cả khi nó không phải là tham chiếu không?
Kyle Delaney

1
@KyleDelaney Tôi không nghĩ rằng trình biên dịch có thể làm được điều đó. Tôi sẽ cân nhắc việc đưa một bản sao hoặc lệnh xcopy vào sự kiện xây dựng trước / sau xây dựng của dự án / giải pháp. Tuy nhiên, đó là thủ công, nhưng nói chung các tham chiếu không thay đổi quá thường xuyên và một bộ thử nghiệm thích hợp sẽ bắt được các trường hợp bạn quên cập nhật các lệnh được thực thi trong sự kiện trước khi xây dựng / sau khi xây dựng.
Manfred

Cảm ơn vi đa trả lơi!
Kyle Delaney

Liên kết đến bài báo đã chết.
Roald

@Roald Cảm ơn bạn. Vâng, liên kết thực sự bị hỏng. Microsoft chỉ cung cấp định dạng HCM của toàn bộ tạp chí MSDN Magazine tại một URL khác. Wayback Machine cũng chỉ có một ảnh chụp nhanh của bài báo ở định dạng HTML với một số hình thức đơn giản hóa. Tôi đã cập nhật câu trả lời để phản ánh điều này và tôi cũng đã xóa liên kết bị hỏng khỏi câu trả lời của mình. Hi vọng điêu nay co ich.
Manfred

12

Tôi đã sử dụng công cụ đi bộ phụ thuộc để kiểm tra các tham chiếu nội bộ mà dll đang có. Hóa ra nó cần thời gian chạy VB msvbvm60.dll và vì hộp nhà phát triển của tôi không có cài đặt đó nên tôi không thể đăng ký nó bằng cách sử dụng regsvr32

Đó dường như là câu trả lời cho câu hỏi ban đầu của tôi.


Trong trường hợp của tôi, tôi phải xóa thư mục obj cho dự án mà tôi đang cố gắng tham chiếu và sau đó tôi xây dựng lại dự án.
Tolu

7

Đảm bảo rằng trình biên dịch của bạn được đặt thành x86 nếu bạn đang cố gắng tham chiếu đến một dll x86 ...

Tôi đang gặp sự cố tương tự ... như đã đề cập ở trên, cố gắng sử dụng OLEDB để truy cập tệp Excel từ mã C # của tôi trong Visual Studio 2012.

Tôi liên tục gặp lỗi về việc không thể truy cập thư viện Access nhưng tôi biết rằng tôi đã tải nó.

Trong khi gỡ lỗi, tôi nhận ra rằng tôi đang biên dịch cho 64 bit nhưng đã tải Office x86. Mặc dù tôi đã tải thư viện Access cho 32 bit, nhưng nó chưa bao giờ được ứng dụng sử dụng ... và do đó, không thể truy cập được.

Đây là những gì tôi đã sử dụng trong C #:

"Nhà cung cấp = Microsoft.ACE.OLEDB.12.0; Nguồn dữ liệu =" + strFilePath + "; Thuộc tính mở rộng = 'Excel 12.0 Xml; HDR = Có'";

... tôi đã gặp lỗi

Ngay sau khi tôi chuyển trình biên dịch sang x86, nó đã hoạt động


2

Tôi vừa gặp phải vấn đề đó và sau tất cả các giải thích về cách khắc phục nó bằng dấu nhắc lệnh, tôi thấy rằng nếu bạn thêm nó trực tiếp vào dự án thì bạn có thể chỉ cần đưa thư viện vào mỗi trang mà nó cần.


2

Tôi gặp vấn đề tương tự với việc nhập WinSCard.dll trong dự án của mình. Tôi giải quyết việc nhập trực tiếp từ dll như thế này:

[DllImport("winscard.dll")]
public static extern int SCardEstablishContext(int dwScope, int pvReserved1, int pvReserved2, ref int phContext);

[DllImport("winscard.dll")]
public static extern int SCardReleaseContext(int phContext);

Bạn có thể thêm điều này vào dự án riêng biệt và sau đó thêm tham chiếu từ dự án chính của bạn.


1

Tôi gặp sự cố này sau khi PC của tôi được khởi động lại trong quá trình xây dựng giải pháp. Hai tham chiếu của tôi đã biến mất, vì vậy tôi phải xây dựng lại hai dự án của mình theo cách thủ công và sau đó tôi có thể thêm các tham chiếu mà không bị lỗi.


1

Bạn không thể thêm một tham chiếu đến một DLL gốc . Tuy nhiên, Bạn có thể đưa chúng vào giải pháp (nhấp chuột phải vào giải pháp, chọn "Thêm tệp hiện có"), nhưng chúng sẽ không được tham chiếu trừ khi bạn khai báo điều gì đó như

[DllImport("...")]
public static extern void MyFunction();

Có thể có một số loại DLL của trình bao bọc , mà bạn thực sự đang tham chiếu và chứa các nhập DLL.

Đôi khi, Bạn có thể tham chiếu đến DLL của trình bao bọc nhưng vẫn không thể làm cho chương trình của bạn chạy, trong đó dấu nhắc lỗi đề xuất bạn đảm bảo tệp tồn tại và tất cả các phụ thuộc đều có sẵn.

Sự cố này là do lắp ráp bạn đang cố gắng thêm được nhắm mục tiêu và biên dịch chỉ cho kiến trúc bộ xử lý x86 hoặc x64 .

Chỉ cần thử thay đổi Nền tảng mục tiêu thành x86 hoặc x64 trong Xây dựng -> Trình quản lý cấu hình .


1

Tôi cần thay đổi kiến ​​trúc thành x86 từ x64 trong trình quản lý cấu hình và sao chép dll 32 bit (ngôn ngữ C - pcProxAPI.dll) của tôi vào thư mục mới mà tôi đã tạo .. Đây là bước trên cùng của các bước được mô tả bởi "Sashus" bên dưới .

C: \ Projects .. \ bin \ x86 \ Debug


Đây cũng là vấn đề của anh ấy đối với tôi.
rogue39nin

nhưng nếu mặc định không phải là x86 cũng không phải x64? nhưng .... "Bất kỳ Cpu" xuất hiện ...?
gumuruh

codeproject.com/articles/1160645/… Bất kỳ cpu nào cũng có thể hoạt động nếu bạn sao chép dll 32 bit ở đó
boateng

1

Tôi đã gặp vấn đề tương tự khi cố gắng thêm một dll mà tôi vừa viết mã bằng C ++ vào dự án C # mới của mình. Hóa ra tôi cần đặt các thuộc tính của dự án C ++ mà dll của tôi lấy từ:

  • Configuration Properties\General\Common Language Runtime Support: /clr
  • Configuration Properties\C/C++\General\Common Language RunTime Support: /clr

Bởi vì dự án C # mà tôi muốn sử dụng dll này cũng được đặt như vậy (có cùng các thuộc tính được đặt thành /clr).


Solution Explorer> Propertise> Cấu hình Propertise
Yuresh Karunanayake

@gumuruh Nếu bạn muốn nói "clr là gì?", thì CLR là docs.microsoft.com/en-us/dotnet/standard/clr
LoukMouk

0

Tôi phải đối mặt với một vấn đề tương tự. Tôi đang cố gắng thêm tham chiếu của dll .net 2.0 vào dự án .Net 1.1. Khi tôi thử thêm phiên bản trước của tệp .dll đã được tuân thủ trong .Net 1.1. nó đã làm việc cho tôi.


0

Đối với bất kỳ ai khác đang tìm kiếm trợ giúp về vấn đề này hoặc gặp phải FileNotFoundException hoặc FirstChanceException, hãy xem câu trả lời của tôi tại đây:

Trường hợp ngoại lệ cơ hội đầu tiên của loại 'System.IO.FileNotFoundException' đã xảy ra trong mscorlib.ni.dll - Windows Phone

Nói chung, bạn phải hoàn toàn chắc chắn rằng bạn đang đáp ứng tất cả các yêu cầu để thực hiện tham chiếu - tôi biết đó là câu trả lời hiển nhiên, nhưng có thể bạn đang bỏ qua một yêu cầu tương đối đơn giản.


Xem xét sự khác biệt giữa các phiên bản khung liên quan đến tham chiếu - nhiều khi sử dụng phiên bản khung mới hơn sẽ không tạo ra sự khác biệt.
JHaps

0

Tôi đã gặp lỗi này khi viết Dịch vụ Windows. Tôi đang chạy Visual Studio với tư cách Quản trị viên để các lệnh xây dựng bài đăng của tôi sẽ tự động cài đặt dịch vụ của tôi. Tôi nhận thấy rằng khi tôi đóng mọi thứ và chạy VS bình thường (Không phải với tư cách Quản trị viên), nó cho phép tôi thêm các tham chiếu tốt mà không có lỗi.

Hy vọng giải pháp này làm việc cho bạn.


0

Thông thường trong Visual Studio 2015, bạn nên tạo dự án dll dưới dạng dự án C ++ -> CLR từ các mẫu của Visual Studio, nhưng về mặt kỹ thuật, bạn có thể kích hoạt nó sau thực tế:

Thuộc tính quan trọng được gọi là Common Language Runtime Supportthiết lập trong cấu hình dự án của bạn. Nó được tìm thấy bên dưới Configuration Properties > General > Common Language Runtime Support.

Khi thực hiện việc này, VS có thể sẽ không cập nhật tùy chọn 'Target .NET Framework' (giống như nó nên làm). Bạn có thể thêm thủ công này bằng cách dỡ bỏ dự án của mình, chỉnh sửa tệp your_project.xxproj và thêm / cập nhật Target .NET framework Versionthẻ XML.

Đối với một ví dụ, tôi khuyên bạn nên tạo một giải pháp mới như một dự án C ++ CLR và kiểm tra XML ở đó, thậm chí có thể thay đổi nó để đảm bảo rằng không có gì rất quan trọng khác thường.


0

Câu trả lời của tôi là hơi muộn, nhưng để kiểm tra nhanh, hãy đảm bảo rằng bạn đang sử dụng phiên bản thư viện mới nhất.

Trong trường hợp của tôi sau khi cập nhật thư viện nuget đang tham chiếu đến thư viện khác gây ra sự cố, sự cố đã biến mất.


0

Bạn có thể thêm tệp .dll theo cách thủ công. Ví dụ: nếu bạn muốn thêm tệp dll trong ứng dụng WPF của mình và bạn không thể tham chiếu tệp đó trong dự án của mình

(Gặp lỗi: Không thể thêm tham chiếu đến ".... dll". Vui lòng đảm bảo rằng tệp có thể truy cập được và đó là hợp lệ hoặc thành phần COM),

sau đó SAO CHÉP tệp dll đó và DỪNG trong DỰ ÁN CÀI ĐẶT (trong thư mục ứng dụng).


0
  1. bắt đầu cmd.exe và gõ:
  2. Regsvr32% dllpath%
  3. "% dllpath%" thay thế thành đường dẫn dll của bạn
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.