2014-04-15 15 views
6

Tôi phát triển một hệ thống có các plugin, tải các hội đồng vào thời gian chạy. Tôi có một thư viện giao diện chung, mà tôi chia sẻ giữa máy chủ và các plugin của nó. Tuy nhiên, khi tôi thực hiện LoadFrom cho thư mục plugin và cố gắng tìm tất cả các loại, trong đó thực hiện giao diện phổ biến IServerModule tôi nhận được ngoại lệ thời gian chạy:Cách lắp ráp đúng cách

Loại 'ServerCore.IServerModule' tồn tại trong cả hai 'ServerCore.dll' và ' ServerCore.dll'

tôi tải plugin như thế này:

foreach (var dll in dlls) 
{ 
      var assembly = Assembly.LoadFrom(dll); 
      var modules = assembly.GetExportedTypes().Where(
       type => (typeof (IServerModule)).IsAssignableFrom(type) 
       && !type.IsAbstract && 
       !type.IsGenericTypeDefinition) 
       .Select(type => (IServerModule)Activator.CreateInstance(type)); 
      result.AddRange(modules); 
} 

Làm thế nào tôi có thể đối phó với vấn đề này?

Tôi sẽ rất biết ơn vì bất kỳ trợ giúp nào

+0

Bạn đã thấy điều này? http://stackoverflow.com/questions/1057853/the-type-type-exists-in-both-dlls – Halvard

+0

@Halvard Có, tôi có. Nhưng tôi không có phiên bản khác nhau, tôi có rắc rối với loadfrom, tải tôi lắp ráp tương tự hai lần –

+0

Liệu nó tải ** cùng một lắp ráp ** hai lần hoặc không tải ** lắp ráp ** tương tự hai lần? – Halvard

Trả lời

0

Vâng, giải pháp của tôi là xấu xí, nhưng công trình và tôi sẽ tiếp tục cho MEF trong tương lai (có thể). Còn bây giờ, tôi đã thêm điều như vậy:

if(Path.GetFileNameWithoutExtension(dll)==Assembly.GetCallingAssembly().GetName().Name) 
    continue; 

Cảm ơn tất cả mọi người cho tuyệt vời trả lời

EDIT: Tôi đã đưa ra giải pháp thanh lịch hơn, ở đây là:

var frameworkAssemblies = 
       from file in new DirectoryInfo(frameworkDirectory).GetFiles() 
       where (file.Extension.ToLower() == ".dll" || file.Extension.ToLower() == ".exe") 
       && !AppDomain.CurrentDomain.GetAssemblies().Select(a => a.GetName().Name).Contains(file.GetFileNameWithoutExtension()) 
       select Assembly.LoadFrom(file.FullName); 
3

Kiểm tra vấn đề DLL và phụ thuộc của nó. Rất có thể là nó được kéo vào ServerCore.dll từ một phiên bản .NET khác với ứng dụng chính của bạn.

Tôi khuyên bạn nên sử dụng MEF nếu bạn muốn thực hiện plugin.

+0

Không ... Tất cả các dự án của tôi đều được xây dựng với .Net 4.5. Tôi sử dụng Simplee Injector sau khi tôi nhận được các bản bổ sung. MEF có thể cung cấp cho tôi những gì? Tôi luôn luôn mặc dù MEF là loại IoC-container, tôi có đúng không? –

+2

MEF dành riêng cho các plugin - nó tải các assembly và phát hiện các triển khai giao diện với sự hỗ trợ cho việc sử dụng các thuộc tính để cấu hình các plugin. Nó là giá trị đọc trang nhất ít nhất. Đối với vấn đề cụ thể của bạn, sử dụng ndepend hoặc ILSpy hoặc .NET Reflector để kiểm tra DLL và ứng dụng của bạn và xác minh ServiceCore.dll đang được kéo vào cho mỗi. Lỗi này là do dll đang được tải 2x từ các vị trí khác nhau. – Brandon

+1

@AlexVoskresenskiy quan niệm sai lầm phổ biến. MEF KHÔNG phải là IOC. IOC KHÔNG phải là công cụ cắm. Ví dụ, bạn nên nhìn vào lớp 'Lazy ' đi kèm với MEF. – Aron

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