2014-07-21 13 views
5

Tôi có một dịch vụ cửa sổ thực hiện một lần một ngày. Nó chỉ có 10 phút hành động.Sử dụng. NET lắp ráp mà không cần khóa tập tin dll

Tôi tạo tệp của dịch vụ trong thư mục bin của trang web, bởi vì dịch vụ sử dụng dll của trang web.

Thật không may, tôi nhận thấy rằng khi tôi cài đặt mô-đun trang web (mô-đun dotnetnuke .zip của trình cài đặt trang web), tôi gặp lỗi khi tệp bị khóa bởi quá trình xử lý.

Tắt dịch vụ trước khi mỗi mô-đun được cài đặt là rất có vấn đề vì vậy tôi muốn làm cho dịch vụ của tôi không khóa các dll được sử dụng trong đó.

Tôi đã đọc về các tùy chọn AppDomain và ShadowCopyFiles, nhưng tôi KHÔNG thể làm cho chúng hoạt động cho tôi.

Đây là một ví dụ về cách tôi sử dụng ShadowCopyFiles:

class Program 
{ 
    static string GenerateRandomName() 
    { 
     //maybe name must be unique?! 
     var random = new Random(); 
     return "a" + random.Next().ToString() + "b" + random.Next(); 
    } 

    static int RandomNumber() 
    { 
     var info = ConfigureAppDomainSettings(); 

     var domain = AppDomain.CreateDomain(GenerateRandomName(), null, info); 
     var assembly = domain.Load("SharedLibrary"); 
     var shared = (SharedLibrary.IShared)assembly.CreateInstance("SharedLibrary.Shared"); 

     int retVal = shared.RandomNumber(); 

     AppDomain.Unload(domain); 

     domain = null; 
     assembly = null; 
     shared = null; 
     info = null; 

     Console.WriteLine("before cleanning"); 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
     GC.Collect(); 
     GC.WaitForFullGCComplete(); 
     GC.Collect(); 
     Console.WriteLine("after cleanning"); 

     return retVal; 
    } 

    static AppDomainSetup ConfigureAppDomainSettings() 
    { 
     AppDomainSetup domainSettings = AppDomain.CurrentDomain.SetupInformation; 
     domainSettings.ShadowCopyFiles = "true"; 
     domainSettings.CachePath = @"C:\inetpub\wwwroot\eshop\DesktopModules\Rossnet_EShop\SharedAssemblyTest\PrivateCache"; 

     return domainSettings; 
    } 

    static void Main(string[] args) 
    { 
     Console.WriteLine(RandomNumber()); 

     Console.ReadKey(); 
    } 
} 

Mã ví dụ lắp ráp:

public interface IShared 
{ 
    int RandomNumber(); 
} 

[Serializable] 
public class Shared : IShared 
{ 
    public int RandomNumber() 
    { 
     var random = new Random(); 
     return random.Next(20); 
    } 
} 

Một bộ nhớ cache tin được tạo ra và không bị khóa và file gốc bị khóa. < - ngay bây giờ điều này là vô lý đối với tôi.

+0

Giao diện IShared của bạn được tải vào cả hai miền ứng dụng. Mà đặt một khóa vĩnh viễn trên DLL. Đặt lớp Chia sẻ vào một lớp khác. –

+0

Tôi truyền sang loại động thay vì giao diện trước đó và nó không hoạt động, vì vậy nó không phải là vấn đề duy nhất với mã của tôi. –

Trả lời

8

Nếu bạn có quyền truy cập để sửa đổi tất cả mã sử dụng các hội đồng, chỉ cần tải chúng bằng cách quá tải Assembly.Load mất byte[] nên thực hiện thủ thuật. Bạn sẽ tự mình đọc tệp và chuyển nó cho phương thức đó. Tôi sử dụng cách tiếp cận này bản thân mình (vì những lý do khác), và nó cho tôi khả năng cập nhật các tập tin bất cứ lúc nào.

Cách thực hiện điều này một cách dễ dàng (mặc dù hơi lạ) là đổi tên tệp của bạn (từ .dll sang tên khác, vì vậy không thể tìm thấy chúng) và sau đó đăng ký sự kiện AppDomain.AssemblyResolve, họ đang thiếu, tại thời điểm đó bạn có thể có mã của bạn tải thủ công các hội đồng.

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