2011-08-08 23 views
5

Tôi có tên miền ứng dụng con nơi tôi muốn tải một số thư viện dll khi khởi động và phát hành tệp để bất kỳ ai cũng có thể xóa chúng.Lắp ráp vào AppDomain con và phát hành tập tin dll

On khởi động tôi làm

Loader al = (Loader)domain.CreateInstanceAndUnwrap(
typeof(Loader).Assembly.FullName, 
typeof(Loader).FullName); 
al.Load(path) 

cho lớp sau.

class Loader : MarshalByRefObject 
{ 
    internal void Load(string path) 
    { 
     Assembly assembly; 
     try 
     { 
      assembly = Assembly.Load(File.ReadAllBytes(path)); 
     } 
     catch (Exception) { return; } 
    } 
    internal UseType(string fullyQualifiedTypeName) 
    { 
     Type userType = Type.GetType(fullyQualifiedTypeName); 
    } 
} 

Sau đó tôi gọi UseType và tôi nhận được đúng loại nhưng tôi không thể để xóa các tập tin bất kỳ hơn bởi vì nó là như thể đứa trẻ app-miền đã bị khóa dll.

Về cơ bản những gì tôi muốn đạt được là lưu trữ tệp lắp ráp khi khởi động và sau đó sử dụng các cuộc gọi GetType để tệp dll thực tế sẽ được phát hành.

Thực sự có thể đạt được điều gì đó như thế này không?

+0

CreateInstanceAndUnwrap() cũng nhận được loại được tải vào tên miền ứng dụng chính. Khóa tệp nào. Sử dụng một loại giao diện, được định nghĩa trong một hội đồng riêng biệt. –

+0

Tôi có thể có tệp chứa Trình tải bị khóa. Hoặc bất kỳ loại nào được sử dụng trong các phương thức của Trình tải sẽ làm cho nó được lắp ráp để được tải trong miền ứng dụng mẹ? – Egor

+0

Xem thêm: http://stackoverflow.com/questions/6480140/appdomain-shadow-copying-not-working-original-assemblies-locked – cdiggins

Trả lời

5

Sử dụng bản sao bóng khi bạn tạo Miền ứng dụng. Điều đó sao chép các dlls vào một bộ nhớ cache và bất cứ ai có thể tương tác với hệ thống tập tin.

Topshelf thực hiện việc này với giá của chúng tôi (mọi thứ đều tồn tại trong miền ứng dụng riêng của nó sau đó) - https://github.com/Topshelf/Topshelf/blob/v2.3/src/Topshelf/Model/ShelfReference.cs#L126.

Cập nhật: Topshelf không còn thực hiện việc này nữa, nhưng đã cập nhật liên kết đến phiên bản đã thực hiện.

+0

Cảm ơn câu trả lời của bạn! – Egor

+0

Không có vấn đề, hy vọng nó đã giúp! – Travis

+0

Có nó đã giúp! Chỉ cần có thuộc tính ShadowCopyDirectories được yêu cầu, nếu thư viện là từ nguồn tùy chỉnh. – Egor

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