2009-09-22 32 views
10

Tôi có một số mã C# (chúng ta hãy gọi nó là "kịch bản") Tôi đang biên dịch tại thời gian chạy. Nó sử dụng một giao diện trong chương trình chính của tôi mà tôi sử dụng để truy cập các chức năng của nó. Sau khi biên dịch xong, tôi có CompilerResults.CompiledAssembly, trong trường hợp này tôi có thể CreateInstance(Type).Unload CodeDom biên dịch lắp ráp

Khi tôi hoàn thành việc sử dụng tập lệnh, tôi muốn bỏ hoàn toàn. Từ những gì tôi hiểu, tôi chỉ có thể làm điều này nếu tôi có thể tạo một miền ứng dụng riêng biệt: Loading DLLs into a separate AppDomain

tôi đã có một số câu hỏi cụ thể để triển khai thực hiện của tôi:

  1. Nếu tôi có nhiều kịch bản để biên dịch và muốn dỡ bỏ chúng độc lập, tôi có phải tạo các miền ứng dụng riêng biệt cho từng miền không?
  2. Tôi nên sử dụng tên miền ứng dụng nào? GUIDs sẽ là một ý tưởng tốt? Có tên nào tôi nên tránh mà có thể xung đột?
  3. Nếu hội đồng nằm trong miền ứng dụng riêng biệt, nó có gặp sự cố khi truy cập giao diện trong chương trình chính không? Tôi hiện đang làm ReferencedAssemblies.Add(typeof(Interface).Assembly.Location) trước khi tôi biên dịch.
  4. Tôi có thể sử dụng CompilerParameters GenerateInMemory=true hoặc tôi có phải lưu nó ở đâu đó không?

Trả lời

2

Answers theo thứ tự:

  1. Vâng, nếu bạn muốn dỡ bỏ chúng một cách độc lập, bạn sẽ cần lĩnh vực ứng dụng riêng biệt.
  2. Sử dụng mọi thứ. Nó có thể giúp bạn gỡ lỗi nếu bạn có thể xác định nó trở lại kịch bản, nhưng điều đó sẽ đúng hơn cho Chủ đề thực hiện.
  3. Không miễn là bạn đặt đường dẫn cơ sở của tên miền thành của riêng bạn.

    AppDomainSetup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;

  4. Không, bạn không cần phải lưu nó và nó không có vẻ như nó sẽ có lợi cho bạn.

+0

Tôi gặp sự cố khi làm việc này nên tôi đã nghiên cứu thêm. Có vẻ như tôi sẽ cần thực hiện thêm một số công việc để làm việc đó: http://www.devsource.com/c/a/Using-VS/Dynamic-Plugins-Using-the-codeAppDomaincode-Class-to-Load -and-Unload-Code /. Trừ khi có một cái gì đó mới trong các phiên bản sau này? –

+0

Có vẻ như tôi đang may mắn. Vì tôi đang sử dụng .NET 3.5 Tôi có thể sử dụng Khung mở rộng được quản lý. Tất nhiên, tôi phải học nó ngay bây giờ. :) –

+1

Có vẻ như tôi đang đi sâu hơn tôi muốn/mong đợi. MEF thực sự không thể dỡ bỏ các assembly vì nó không sử dụng một AppDomain riêng biệt. MAF (System.AddIn) có thể, nhưng phức tạp hơn nhiều để sử dụng. MAF và MEF có thể được sử dụng cùng nhau. Trong khi tôi thực sự muốn để có thể dỡ bỏ một hội đồng, tôi nghĩ rằng điều này sẽ phải chờ ít nhất cho phiên bản 2. –

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