2010-04-26 25 views
18

Tôi đang cố gắng tải một dll vào một ứng dụng giao diện điều khiển và sau đó dỡ bỏ nó và xóa các tập tin hoàn toàn. Vấn đề tôi gặp phải là hành động tải dll trong AppDomain của riêng nó tạo ra một tham chiếu trong Parent AppDomain do đó không cho phép tôi phá hủy tệp dll trừ khi tôi hoàn toàn tắt chương trình. Bất kỳ suy nghĩ về làm cho mã này hoạt động?Tải Assembly trong AppDomain mới mà không tải nó trong Parent AppDomain

string fileLocation = @"C:\Collector.dll"; 
AppDomain domain = AppDomain.CreateDomain(fileLocation); 
domain.Load(@"Services.Collector"); 
AppDomain.Unload(domain); 

BTW Tôi cũng đã thử mã này không có may mắn hoặc

string fileLocation = @"C:\Collector.dll"; 
byte[] assemblyFileBuffer = File.ReadAllBytes(fileLocation); 

AppDomainSetup domainSetup = new AppDomainSetup(); 
domainSetup.ApplicationBase = Environment.CurrentDirectory; 
domainSetup.ShadowCopyFiles = "true"; 
domainSetup.CachePath = Environment.CurrentDirectory; 
AppDomain tempAppDomain = AppDomain.CreateDomain("Services.Collector", AppDomain.CurrentDomain.Evidence, domainSetup); 

//Load up the temp assembly and do stuff 
Assembly projectAssembly = tempAppDomain.Load(assemblyFileBuffer); 

//Then I'm trying to clean up 
AppDomain.Unload(tempAppDomain); 
tempAppDomain = null; 
File.Delete(fileLocation); 

Trả lời

5

OK vì vậy tôi giải quyết vấn đề riêng của tôi ở đây. Rõ ràng nếu bạn gọi AppDomain.Load nó sẽ đăng ký nó với AppDomain cha mẹ của bạn. Vì vậy, chỉ đơn giản là đủ câu trả lời là không phải để tham khảo nó cả. Đây là liên kết đến trang web hiển thị cách thiết lập đúng cách.

https://bookie.io/bmark/readable/9503538d6bab80

+1

Liên kết này là chết! – ZioN

+5

Vui lòng cung cấp mã số – ZioN

+0

liên kết mới: https://bmark.us/bmark/readable/9503538d6bab80 – user1

4

này nên đủ đơn giản:

namespace Parent { 
    public class Constants 
    { 
    // adjust 
    public const string LIB_PATH = @"C:\Collector.dll"; 
    } 

    public interface ILoader 
    { 
    string Execute(); 
    } 

    public class Loader : MarshalByRefObject, ILoader 
    { 
    public string Execute() 
    { 
     var assembly = Assembly.LoadFile(Constants.LIB_PATH); 
     return assembly.FullName; 
    } 
    } 

    class Program 
    { 
    static void Main(string[] args) 
    { 
     var domain = AppDomain.CreateDomain("child"); 
     var loader = (ILoader)domain.CreateInstanceAndUnwrap(typeof(Loader).Assembly.FullName, typeof(Loader).FullName); 
     Console.Out.WriteLine(loader.Execute()); 
     AppDomain.Unload(domain); 
     File.Delete(Constants.LIB_PATH); 
    } 
    } 
} 
+0

Không hoạt động. Tôi nhận được một ngoại lệ truy cập trái phép khi tôi cố gắng xóa các tập tin. Bạn đã kiểm tra mã của mình chưa? –

+0

@WolfgangRoth - nó làm việc cho tôi. nếu bạn gặp vấn đề cụ thể, tôi khuyên bạn nên đặt một câu hỏi mới. –

+0

Tôi đã giải quyết được vấn đề của mình: trên thực tế, trình gỡ rối studio trực quan tự kết nối với assembly trong khi gỡ lỗi và nó không ngắt kết nối nữa. Nhưng khi tôi chạy mà không cần trình sửa lỗi hoặc khi tôi lần đầu tiên tải tập tin lắp ráp vào một mảng byte, mọi thứ hoạt động tốt ... –

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