2017-08-30 14 views
10

Tôi có một trang web ASP.NET mà không CreateInstanceAndUnwrap:CreateInstanceAndUnwrap bị treo dll dưới IIEXpress

var setup = new AppDomainSetup 
     { 
      ShadowCopyFiles = "true", 
      ShadowCopyDirectories = "true", 
      ApplicationBase = textPipe["host"] == "web" ? Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath) : Environment.CurrentDirectory, 
      ConfigurationFile = $"UnitTests/{testProject}/app.config" 
     }; 

     var domain = AppDomain.CreateDomain("UnitTestDomain", null, setup); 

     var type = typeof(TestProxy); 
     var instance = (TestProxy)domain.CreateInstanceAndUnwrap(
      type.Assembly.FullName, 
      type.FullName); 

Tất cả các công trình, nhưng sau khi tôi chạy mã này dưới IISExpress trên máy trạm dev của tôi, tôi không còn có thể biên dịch lại các file DLL - lỗi tôi nhận được là "Không thể sao chép tập tin .... bởi vì nó đang được sử dụng bởi một quá trình khác." Tôi phải dừng IISExpress trước khi biên dịch lại. Điều này chắc chắn sẽ là vấn đề lớn hơn trong sản xuất, nếu cần thiết phải dừng AppPool trước mỗi lần triển khai.

Bạn không chắc chắn lý do tệp bị khóa? Tôi đang sử dụng ShadowCopyFiles và ShadowCopyDirectories, nhưng điều đó dường như không giúp được gì.

Tôi có thể làm gì để tránh các tệp bị khóa? Cảm ơn bạn.

+0

bạn đã thử với 'CrossAppDomainDelegate'? – Webruster

Trả lời

2

Nó được một lúc kể từ khi tôi đã phải đối phó với AppDomain, nhưng tôi nghĩ rằng có lẽ gọi

AppDomain.Unload(domain) 

ở phần cuối của các yêu cầu có liên quan cần giải phóng assembly. Nếu có nhu cầu về nó trong bộ nhớ liên tục (nếu nó quá đắt để tải lại theo yêu cầu), thì việc dỡ bỏ miền có thể sẽ không hoạt động cho bạn.

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