2009-09-25 31 views
6

Tôi có một hội đồng được thực hiện trong một dự án khác (projA). Bây giờ tôi muốn nhập dll này vào một dự án khác (projB). Làm thế nào tôi có thể đạt được điều này? Đây là những gì tôi đã thử (trong projB).ASP.NET Cách thêm assembly vào web.config?

1 Đặt dll vào cùng một thư mục như dự án của tôi. (Thùng dir)

2 Trong web.config:

<assemblies> 
    <add assembly="projA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
</assemblies> 

Đây là lỗi tôi nhận được:

Không thể tải tập tin hoặc lắp ráp 'projA, Version = 1.0.0.0, Culture = trung lập, PublicKeyToken = 31bf3856ad364e35 'hoặc một trong các phụ thuộc của nó. Định nghĩa tệp kê khai của assembly được đặt không khớp với tham chiếu assembly. (Ngoại lệ từ HRESULT: 0x80131040)

EDIT:

Vấn đề là mà cuối cùng các tài liệu tham khảo lắp ráp phải tôi thêm động

EDIT 2:

Tên của lắp ráp (và không gian tên) là được lưu trữ trong cơ sở dữ liệu. Việc lắp ráp vật lý (dll) được thêm vào (bằng cách cài đặt) trong projB. Bây giờ mã trong projB phải đọc tên lắp ráp từ cơ sở dữ liệu và sau đó thêm một tham chiếu đến dll được thêm vào bằng cách cài đặt.

+0

chỉnh sửa của bạn triệt để thay đổi câu hỏi cho tâm trí của tôi. –

Trả lời

7

Có phải tất cả các phụ thuộc của projA trong projB không? Thông thường tôi chỉ cần thêm một tài liệu tham khảo từ một dự án khác nếu họ đang ở trong cùng một giải pháp.

Chỉnh sửa:

Nếu bạn muốn thêm lắp ráp động thì có thể tham chiếu dịch vụ có thể cần xem xét. Bằng cách kết xuất DLL của projA vào thùng không thực sự cung cấp tất cả các DLL mà nó có thể yêu cầu, do đó có nhiều cách để kết nối mọi thứ với nhau để các đối tượng có thể được hiểu trên các hệ thống, như các dịch vụ web sử dụng XML để đưa ra một ví dụ phổ biến.

Câu hỏi của tôi về việc thêm lắp ráp động là nơi bạn sẽ lấy nó và phần đó có thể tự động là một phần của projB vì đó thực sự là giải pháp chung cho loại vấn đề này không.

Chỉnh sửa 2:

Làm cách nào bạn có thể nhận được tất cả các phụ thuộc của projA? Có thể để có được nó để nó không phụ thuộc vào một loạt các DLL khác có thể hoặc có thể không có trên hệ thống mà điều này là để chạy. Đó là những gì lỗi đang nói với bạn, rằng có tồn tại một số projC lắp ráp cũng được yêu cầu. Lưu ý rằng việc bổ sung các assembly này có thể tiếp tục trong một thời gian dài nếu có nhiều mức phụ thuộc được sử dụng.

Tóm tắt câu trả lời: Bạn cần tham khảo những gì để tải projA vào một số dự án mới? Đó là vấn đề của bạn mà không biết phụ thuộc trông như thế nào là khó trả lời trực tiếp.

+0

Vấn đề là cuối cùng tham chiếu lắp ráp phải tôi thêm động – Martijn

+0

Tôi xin lỗi vì đã quá khó hiểu, tôi đã chỉnh sửa bài đăng của mình. Hy vọng rằng điều này làm cho nó rõ ràng hơn – Martijn

4

Bạn không cần phải thêm bất kỳ thứ gì trong Web.config nếu tệp DLL lắp ráp nằm trong thư mục Bin - bạn chỉ cần thực hiện việc này nếu bạn đang tham chiếu một assembly trong GAC.

Thông báo lỗi bạn đang nhận được về cơ bản nói rằng không thể tìm thấy hội đồng trong GAC, có lẽ vì nó không có ở đó!

+1

Trình tải lắp ráp sẽ tìm trong thư mục cục bộ/bin trước, các kết hợp khác của/bin/và tên assembly, các thư mục khung, vv trước khi đi tới GAC. –

+0

Xem chỉnh sửa của tôi trên startpost – Martijn

3

Bạn không cần phải thêm tham chiếu theo cách thủ công vào tệp web.config.Nhấp chuột phải vào dự án của bạn trong cửa sổ Solution Explorer trong Visual Studio và chọn 'Thêm tham chiếu'. Vào tab Browse và tìm DLL bạn đã tạo trong dự án khác, chọn nó và nhấn OK. Tùy chọn, bạn có thể thêm dự án A vào cùng một giải pháp như dự án B và sau đó thêm tham chiếu thông qua tab Dự án của cửa sổ Thêm tham chiếu.

+0

Xem chỉnh sửa của tôi trên startpost – Martijn

0

Các lỗi

manifest định nghĩa Việc lắp ráp nằm của không phù hợp với việc lắp ráp tham khảo.

cho thấy rằng một DLL đã được tìm thấy nhưng không khớp với phiên bản hoặc khóa chung. Tôi sẽ đề nghị kiểm tra hai lần để đảm bảo rằng tham chiếu lắp ráp khớp với thông tin phiên bản và không có DLL giả mạo nào có số phiên bản cũ nằm trong đường dẫn/bin hoặc GAC

0

Vâng, tôi đoán ở một mức độ nào đó tùy thuộc vào bạn đang lên kế hoạch làm một khi bạn đã nạp assembly, và những gì bạn đã có trong assembly.

Tôi giả sử bạn có một số loại kiến ​​trúc plugin, với giao diện hoặc lớp cơ sở đã biết mà bạn sắp gọi phương thức, cho phép nói IPlugin.

Dù sao, đây là cách để nạp một assembly động, dựa trên lưu trữ một tham chiếu đến nó trong hoặc là một phần cấu hình hoặc một cột DB đâu đó:

private IPlugin LoadPlugin(string fullTypeName) { 
    Type type = Type.GetType(fullTypeName, false, true); 

    Object plugin = Activator.CreateInstance(type); 

    if (plugin is IPlugin) { 
    return (IPlugin) plugin; 
    } 

    // Handle the fact you've not got what you expected however you like 
    throw new ApplicationException(error); 
} 

Vì vậy, đây sẽ mất một chuỗi như "projA.PluginClass, projA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" tải các lắp ráp, và trả lại cho bạn một thể hiện của lớp bạn đang quan tâm đến

sau đó bạn sẽ sử dụng nó như thế này:.

// Call to DB to get details of class and assembly 
string pluginClass = GetPluginDetails(); 

IPlugin plugin = LoadPlugin(pluginClass); 

// Call known method to do something on IPlugin 
plugin.SomeMethod(); 
Các vấn đề liên quan