2012-03-08 44 views
10

Tôi có một DLL mà tôi muốn thêm là một tham chiếu đến dự án của tôi, nhưng mỗi lần tôi cố gắng để làm điều đó một hộp thoại bật lên nói với tôi:không thể thêm một tham chiếu NET

Các tài liệu tham khảo không thể được thêm. Vui lòng đảm bảo rằng tệp có thể bị tấn công và đó là tệp hợp lệ hoặc thành phần COM hợp lệ.

Tôi đã nghiên cứu một chút và phát hiện ra rằng lỗi là do assembly không được quản lý bởi .NET và tôi nên sử dụng thuộc tính DLLImport, tuy nhiên, tôi có cùng một giải pháp chính xác trong một máy tính khác. .

Sự khác biệt là máy tính mới mà tôi đang cố thêm tham chiếu là x64 và phiên bản cũ là x86.

Tôi có cả tệp x64 và x86 DLL và không thể thêm bất kỳ tệp nào. Tại sao chuyện này đang xảy ra?

+0

có thể bạn sẽ cần DllImport và P/Gọi những thứ như được đề cập trong câu trả lời. – Bahamut

Trả lời

-1

Hãy thử thay đổi Mục tiêu nền tảng của bạn từ CPU bất kỳ thành x86. (thuộc tính dự án -> Xây dựng -> Mục tiêu nền tảng)

12

Bạn không thể thêm DLL không được quản lý làm tài liệu tham khảo trong Visual Studio, bất kể 32 bit "bittyness". Và tôi nghi ngờ rằng nó hoạt động trên máy x86 của bạn.

Có sự khác biệt giữa các tệp DLL "bình thường" và COM-DLL.

Bạn có thể thêm tham chiếu vào COM-DLL sau khi được đăng ký với hệ thống (thực tế bạn tham chiếu đối tượng COM tiếp xúc và tham chiếu đến DLL được thêm tự động). Điều này có thể được thực hiện trên "COM" -Tab của hộp thoại "Thêm tham chiếu" (ở đây bạn phải chắc chắn rằng dự án của bạn được xây dựng như một mục tiêu x86 trong hầu hết các trường hợp).

DLL "bình thường" có thể - như tôi đã nói - không được thêm gì cả. Bạn có thể bao gồm chúng trong các giải pháp (giải pháp kích chuột phải, chọn "Add file đã tồn tại"), nhưng họ sẽ không được tham chiếu trừ khi bạn khai báo một cái gì đó giống như

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

Tôi nghi ngờ rằng trong dung dịch khác của bạn, có một số loại của wrapper DLL, mà bạn đang thực sự tham khảo và có chứa các DLL nhập khẩu.

+0

Tôi xây dựng một thư mục tùy chỉnh như ../bin/ và đặt các DLL cần thiết trong thư mục đó để ứng dụng của tôi chỉ có thể xem định vị chúng theo mặc định. Các mẫu! –

+0

@ Skidoosh, kỹ thuật của bạn chỉ hoạt động với các DLL được quản lý. –

1

Có thể Type Library Importer (Tlbimp.exe) có thể trợ giúp. Nó tạo ra một wrapper .NET dll. Bản gốc COM DLL vẫn phải ở đó và phải được đăng ký! (Hãy thử đăng ký trước, trước khi thử bằng TlbImp.)

Nếu phiên bản 64 bit không hoạt động, hãy đặt đích nền thành x84 trong thuộc tính xây dựng dự án của bạn.

0

không thể của một số DLL được thêm vào như là một tài liệu tham khảo, nhưng tuy nhiên, họ vẫn có thể được sử dụng bởi C# với nổi tiếng [DllImport(params go here...)]

Bạn cũng có thể phải inspect dll để có được địa chỉ của các chức năng bạn muốn để sử dụng. Điều này có thể đạt được bằng cách sử dụng GetProcAddress

2

nhiều answeres cho câu hỏi của bạn:

  1. bạn có thể phải đối mặt với vấn đề này bởi vì lắp ráp bạn đang cố gắng thêm được nhắm mục tiêu và biên dịch cho một kiến ​​trúc vi xử lý x86 .Chỉ cần thử thay đổi Nền tảng mục tiêu từ x64 thành x86 và ngay cả khi việc đó có hiệu lực, hãy thử đổi thành AnyCPU. Mục tiêu nền tảng AnyCPU làm cho ứng dụng của bạn thực thi trên cả hai loại kiến ​​trúc vì nó không có kiến ​​trúc.

  2. Nếu lắp ráp sẽ xảy ra là một DLL, và nó không thể được thêm vào như là một tài liệu tham khảo, sau đó nó là không một COM cũng như NET lắp ráp. Nó sẽ là một bản địa lắp ráp như những người khác (ví dụ, shell32.dll, user32.dl vv). Bạn phải sử dụng chúng thông qua thuộc tính DllImport, nhưng trước tiên bạn phải kiểm tra tài liệu của dll đó để nhận danh sách các hàm được triển khai trong dll đó.

0

Thêm đường dẫn tuyệt đối của dll để DllImport

0

sau khi cố gắng phân tích vấn đề, tôi khám phá ra

sau

[1] đôi khi bạn nhìn thấy các tài liệu tham khảo trong quản lý tài liệu tham khảo, nhưng bạn sẽ không tìm các tệp dll trong thư mục được đề cập, trong đó Trình quản lý tham chiếu không thể thực hiện các tham chiếu.

[2] kiểm tra sự cho phép của tệp dll của bạn.

Các vấn đề liên quan