2015-07-07 14 views
6

Tôi hơi bối rối khi sử dụng lớp học Application và lớp AppDomain.
Ví dụ Application.StartupPath bằng AppDomain.CurrentDomain.BaseDirectorySự khác nhau giữa Ứng dụng và AppDomain.CurrentDomain

Tôi thường sử dụng Application lớp và gần đây phát hiện AppDomain - Ai đó có thể giải thích cho tôi AppDomain lớp và sử dụng của nó?

+1

Lớp Ứng dụng rất cụ thể đối với ứng dụng GUI. Ứng dụng hoặc dịch vụ của giao diện điều khiển không có. Nhưng mọi ứng dụng .NET đều có một AppDomain. Lớp ứng dụng WPF rất khác với lớp Ứng dụng Winforms. Chắc chắn, có một chút trùng lặp, không quá mức như vậy. –

+0

Bạn có thể cung cấp thêm thông tin về chính xác các lớp học bạn đang đề cập đến, với không gian tên không? Nó sẽ làm cho câu hỏi rõ ràng hơn. –

Trả lời

15

Chúng không có điểm chung nào.

Application là một lớp dành riêng cho Windows Forms, một công nghệ .NET GUI. Application.StartupPath được xử lý bởi hàm Kernel32 GetModuleFileName. Thông qua việc không truyền một con trỏ tới một mô-đun, đường dẫn của mô đun chính được trả về - đó là về cơ bản là tệp exe.

AppDomain là khái niệm .NET cốt lõi để tách biệt miền. Về cơ bản, nó cho phép bạn cô lập (không hoàn hảo tất nhiên) nhiều ứng dụng trong một quá trình riêng lẻ. Hầu hết các ứng dụng chỉ có một đơn AppDomain, nhưng bạn có thể tạo bao nhiêu tùy thích. Đường dẫn cơ sở của miền ứng dụng được xử lý bởi Fusion, một công nghệ tải lắp ráp .NET. Một ví dụ rất điển hình sẽ là các ứng dụng ASP.NET được lưu trữ trong IIS - mỗi ứng dụng có AppDomain riêng, nhưng tất cả chúng đều được lưu trữ trong một quá trình riêng ("pool ứng dụng"). Mỗi ứng dụng logic có thể được khởi động lại mà không cần chạm vào các ứng dụng khác và chúng không có quyền truy cập đơn giản, nhưng ngoại lệ xử lý (ví dụ: StackOverflowException) sẽ vẫn giết toàn bộ nhóm.

Một lớp thú vị khác có liên quan phần nào là Environment. Bạn có thể sử dụng Environment.CommandLine để nhận dòng lệnh quy trình (bao gồm đường dẫn đến tệp thực thi, bao gồm tên của tệp thi hành). Về cơ bản đây là giao diện truyền thông giữa CLR và hệ thống cơ bản - trong trường hợp này, nó sẽ lưu các đối số cho ứng dụng (được hệ điều hành chuyển đến hàm Main) và làm cho chúng có sẵn bất cứ lúc nào trong tương lai .

Environment.CommandLine có phần vụng về để phân tích (đó là dòng lệnh thô, về cơ bản - Tôi cho rằng nó sẽ có quy ước khác nhau trên Windows hơn trên Linux, ví dụ), nhưng đó là cách duy nhất bạn có thể luôn đến được thực thi. Một lần nữa, Application.StartupPath là Winforms cụ thể và bạn có thể có nhiều hơn một AppDomain - và có thể, số AppDomain thậm chí có thể không hợp lý BaseDirectory.

API phản chiếu .NET cũng cung cấp cho bạn một số cách. Ví dụ: Assembly.GetEntryAssembly() sẽ cung cấp cho bạn hội đồng thực thi - tuy nhiên, tính năng này chỉ hoạt động cho chính AppDomain - các miền khác sẽ có các cụm mục nhập riêng của chúng (trên thực tế, chúng thường chỉ trả về null :)). Bạn có thể nhận được đường dẫn đến một hội đồng thông qua các tài sản Assembly.CodeBase, nhưng lưu ý rằng điều này có thể không phải lúc nào cũng là những gì bạn mong đợi. Bạn cũng có thể sử dụng Assembly.Location hoặc lấy FullyQualifiedName của bất kỳ mô đun nào của assembly (một lần nữa, hầu hết các assembly chỉ có một mô-đun duy nhất; và một lần nữa, ASP.NET là một trong những ví dụ chính khi không phải là trường hợp này).

+1

Tôi nghĩ Bạn cũng nên bao gồm các công cụ Phản chiếu. Lắp ráp, Module, .... – Behrooz

+1

@Behrooz Added :) – Luaan

+0

Ồ, tôi quên mất System.Diagnostics.Process. damn, có rất nhiều cách – Behrooz

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