2012-04-15 34 views
8

Ứng dụng của tôi tải tất cả các assembly của thư viện nằm trong đường dẫn thực thi của nó và thực hiện các phương thức đã biết trước các lớp chứa.Tải một assembly tại thời gian chạy tham chiếu đến assembly gọi

Tôi bây giờ cần phải làm tương tự với một hội đồng tham chiếu đến hội đồng ứng dụng của tôi. Điều này có khả thi và có bất kỳ tác động tiêu cực nào mà tôi nên biết không?

Thạc sĩ hội:

public abstract class TaskBase 
{ 
    public abstract void DoWork(); 
} 

LoadAssemblyFromFile("Assembly0001.dll"); 
Assembly0001.Task1.DoWork(); 

Assemblies Child:

public sealed class Task1: MasterAssembly.TaskBase 
{ 
    public override void DoWork { /* whatever */ } 
} 
+0

Tôi làm việc này mọi lúc mà không gặp bất kỳ sự cố nào. Bí quyết duy nhất mà tôi đã chạy vào (một vài lần thực sự) là phiên bản quản lý của hội đồng _master_. Nếu bạn thực hiện các thay đổi đối với _master_ mà không biên dịch lại các con, bạn có thể gặp phải một số vấn đề kỳ lạ. –

+0

@ M.Babcock: Cảm ơn. Trong tò mò, loại vấn đề gì? Tôi không tự động tăng phiên bản lắp ráp trên biên dịch lại. Tôi giả sử rằng NÊN nên bỏ qua bất kỳ vấn đề nào bạn có thể gặp phải. Suy nghĩ của bạn? –

+0

Vấn đề phổ biến nhất mà tôi gặp phải là một định nghĩa phương pháp thay đổi phá vỡ tính tương thích ngược, mặc dù trong các trường hợp khác, tôi đã trải qua sự sợ hãi "_Type_ được định nghĩa trong cả _Master_ và _Master_" ngoại lệ (từ bộ nhớ chứ không phải văn bản chữ, nhưng đóng đủ để bạn nhận ra nó). –

Trả lời

6

Có, điều này là có thể. Miễn là hội đồng chủ của bạn không tham chiếu đến hội đồng trẻ em, bạn sẽ ổn thôi. Nếu không, bạn sẽ có một phụ thuộc vòng tròn.

Lắp ráp chính sẽ chỉ tải các cụm con và không biết gì về chúng ngoại trừ việc chúng thực hiện một giao diện. Bằng cách đó, hội đồng chủ không cần phải tham khảo các hội đồng trẻ em.

Không có gotchas theo như tôi biết. Chúng tôi sử dụng kỹ thuật này thành công cho các tình huống nhất định.

+0

Cảm ơn. Trong bối cảnh, có cách nào để tải hội đồng từ bộ nhớ mà không có tập tin lắp ráp có mặt trên đĩa không? Các bản phát hành lắp ráp định kỳ này có mặt trong một cơ sở dữ liệu trung tâm và tôi muốn làm cho người dùng gặp khó khăn về mặt hợp lý. Tất nhiên, tôi hiểu không có cách nào chống lừa đảo để đạt được điều này. –

+0

Có, chúng tôi đã có các ứng dụng dành cho thiết bị di động như vậy. Các nhị phân lắp ráp được lưu trữ trong cơ sở dữ liệu, lấy ra và nạp theo cách đó. Bạn có thể làm điều tương tự. –

+0

Tìm thấy: Assembly.Load (byte []). –

1

Theo kinh nghiệm của tôi có gì sai với điều này. Trong thực tế, MEF sử dụng kỹ thuật này ở dạng AssemblyCatalog (nơi triển khai của bạn là IN hội đồng chủ) và DirectoryCatalog (nơi triển khai giao diện trong các hội đồng trong một thư mục cụ thể).

Cả hai có thể được sử dụng cùng nhau trong một AggregateCatalog không có vấn đề gì.

0

duy nhất "vấn đề" là bạn không thể viết Assembly0001.Task1 trong lắp ráp tổng thể của bạn, nhưng bạn có thể tìm các công việc chính xác trong lắp ráp nạp và gọi đó một:

var asm = LoadAssemblyFromFile("Assembly0001.dll"); 
var taskType = asm.GetTypes().FirstOrDefault(t => typeof(TaskBase).IsAssignableFrom(t)); 
var task = (TaskBase)Activator.CreateInstance(taskType); 
task.DoWork(); 

Bạn sẽ vẫn cần thêm một số kiểm tra an toàn bổ sung :)

+0

Có, tất nhiên. Tạo một cá thể thời gian chạy theo loại là cách duy nhất để đạt được điều này. Bạn sẽ giới thiệu loại kiểm tra bảo mật nào? Ứng dụng này cần phải đảm bảo rằng nó đang thực thi mã riêng của chúng ta (có thể thông qua một băm một chiều). Còn gì nữa? –

+0

Hầu hết chỉ là kiểm tra rỗng, nếu bạn thực sự muốn tạo một sandbox để chạy các nhiệm vụ của mình, nó có thể trở nên khó khăn hơn một chút. – XIU

0

Bạn không đăng mã của phương thức LoadAssemblyFromFile ("..."), nhưng nếu nó sử dụng Assembly.LoadFrom() hoặc Assembly.LoadFile() để tải các assembly, bạn có thể nhận được InvalidCastException, MissingMethodException hoặc các trường hợp ngoại lệ khác, đặc biệt nếu ứng dụng của bạn và được nạp cả hai tham chiếu cùng một assembly khác. LoadFrom() và LoadFile() nạp các assembly trong ngữ cảnh ràng buộc khác với ứng dụng của bạn. Xem this để được giải thích chi tiết.

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