2012-10-18 12 views
24

Tôi có một thư viện lớp .NET có một lớp với một phương thức tĩnh. Tôi muốn mã của tôi chạy phương thức tĩnh đó trong một tiến trình riêng biệt - giống như cách tôi chạy nó trong một luồng riêng biệt chỉ trong một tiến trình riêng biệt.Tôi có thể chạy mã C# trong một quy trình riêng biệt mà không cần tạo ứng dụng bảng điều khiển không?

Tôi biết tôi có thể tạo một dự án ứng dụng bảng điều khiển riêng biệt gọi phương thức tĩnh từ bên trong Main() nhưng điều đó không thuận tiện cho kịch bản triển khai của tôi - tôi không muốn mang thêm tệp .exe. Tôi biết tôi có thể use Powershell để gọi nó nhưng điều đó có nghĩa là phụ thuộc vào Powershell mà tôi muốn tránh.

Có cách nào để chạy mã trong một quy trình riêng biệt bằng .NET không? Có lẽ tôi có thể tạo tệp thực thi cho quy trình riêng biệt đó trong thời gian chạy?

+0

Bạn có thể sử dụng tùy chọn dòng lệnh cho ứng dụng hiện tại của mình không? – Gabe

+0

Tại sao bạn cần phải làm điều này? Nếu quá trình tiếp tục chạy sau khi một trong những ban đầu đã hoàn thành? –

+0

@Gabe: Không, mã hiện tại của tôi là một thư viện lớp được nạp vào đại diện. – sharptooth

Trả lời

23

Unfortunately, you cannot fork in C# like you can in C on POSIX-compatible operating systems.

Bạn có một vài tùy chọn. Vì bạn chỉ muốn bảo vệ chống lại các vòng vô hạn, bạn chỉ có thể sinh ra một số mới Thread (một mới một, không phải là ThreadPool một hoặc một Task một). Sau đó, bạn có thể gọi Abort trên chuỗi nếu bạn cần phải giết nó. Điều này sẽ kích hoạt một ThreadAbortException trong chủ đề khác.

Tùy chọn khác của bạn là AppDomain. You can create a new AppDomain using the currently running assembly relatively trivially. Sau đó, bạn thực hiện cuộc gọi vào một đối tượng proxy thực sự tồn tại trên toàn miền. Proxy sẽ sử dụng điều khiển từ xa .NET cũ để gọi phương thức trên đối tượng thực (vì vậy không có sự chuyển giao chung, vv, vì bạn bị giới hạn bởi các cấu trúc dựa trên .NET 1.1).

Lưu ý rằng không có chiến lược nào ở trên sẽ bảo vệ bạn khỏi sự cố trong mã không được quản lý. Vì AppDomains là một cấu trúc được quản lý, bạn không thể sử dụng chúng để hủy bỏ các lần gác máy không được quản lý.

Nếu thực sự, thực sự, được xác định để có quy trình cấp hệ điều hành thứ hai, bạn cũng có thể tạo một tập hợp thực thi mới trong một tệp tạm thời và bắt đầu trong quá trình mới. See here for an MSDN article on new assembly generation. Lưu ý rằng điều này không hề nhỏ nhặt chút nào.

+3

+1 cho ý tưởng đáng sợ của việc tạo ra các cụm trên bay để chạy trong một quá trình riêng biệt. –

+0

@sharptooth Điều này có trả lời câu hỏi không? –

+2

Vâng, tôi đã tìm thấy câu trả lời tuyệt vời này http://stackoverflow.com/a/826435/57428 về cách tạo ứng dụng bảng điều khiển khi chạy. Điều đó không khó chút nào. – sharptooth

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