2009-06-17 6 views
9

Tôi đang cố gắng khởi chạy một ứng dụng cập nhật bên ngoài cho một nền tảng mà tôi đã phát triển. Lý do tôi muốn khởi chạy trình cập nhật này là vì tiện ích cấu hình của tôi xử lý các bản cập nhật và cấu hình giấy phép cho nền tảng đã chia sẻ các phụ thuộc với các assembly khác trong thư mục mà bản cập nhật sẽ được triển khai. Vì vậy, trong khi tôi có thể đổi tên tiện ích cấu hình và ghi đè lên nó khi triển khai bản cập nhật, tôi không thể đổi tên hoặc ghi đè lên các DLL mà nó phụ thuộc vào. Do đó, ứng dụng cập nhật bên ngoài.Cách tạo một Quy trình phác thảo phụ huynh của mình

Tôi đang xử lý tất cả logic thu thập cập nhật trong tiện ích cấu hình, sau đó cố gắng khởi chạy trình cập nhật để xử lý các hoạt động sao chép/ghi đè tệp thực tế. Rõ ràng, vì các tập tin trong các vấn đề sử dụng, tôi cần tiện ích cấu hình để thoát ngay sau khi trình cập nhật bắt đầu.

Sự cố tôi gặp phải là tôi đang sử dụng phương thức Process.Start chuẩn để khởi chạy trình cập nhật và ngay sau khi tiện ích cấu hình thoát, quá trình cập nhật cũng bị tiêu diệt.

Có cách nào để tôi có thể tạo Quy trình phác thảo bố cục của cha mẹ hoặc khởi chạy một ứng dụng bên ngoài có thể chạy vượt quá chương trình khởi chạy không?

EDIT:

Rõ ràng, trong ứng dụng cập nhật của tôi, tôi tính nhầm số lượng đối số dòng lệnh được truyền cho nó. Bởi vì điều này, updater sẽ thoát ngay lập tức. Tôi đã hiểu sai điều này có nghĩa là ứng dụng trình khởi chạy đã giết quá trình "con", trong khi thực tế, nó không phải.

Câu trả lời bên dưới là chính xác.

+0

Tôi biết đó là loại suy nghĩ ngược, nhưng bạn có thể có một quy trình mà toàn bộ công việc là quản lý bắt đầu cả tiện ích cấu hình và ứng dụng của bạn? Bằng cách đó bạn có thể cập nhật cả ứng dụng và tiện ích cấu hình (nếu cần) một cách riêng biệt và sẽ không phải lo lắng về các tiến trình con chết với cha mẹ của chúng (vì cha mẹ sẽ luôn chạy). –

+0

Tôi đã có một lỗi trong mã cập nhật của tôi buộc nó phải thoát ngay lập tức. Tôi cho rằng đây là từ quá trình "khởi chạy". Tôi đã cập nhật tin nhắn của mình cho phù hợp. Có cách nào để cho bản thân mình tiêu cực như tự trừng phạt vì đã phạm một sai lầm vô lý như vậy? –

+0

Chúng ta có thể giả định rằng bạn đang sử dụng C#/.net/Win32 chứ không phải C#/Mono/* nix? Tôi không biết liệu Quy trình có hoạt động giống nhau trong mọi môi trường hay không. – quillbreaker

Trả lời

11

Bạn có thể chia sẻ một số mã không? Có vẻ như vấn đề bạn đang gặp phải có lý do khác vì lớp học Process sẽ không giết bất kỳ quá trình nào bắt đầu sử dụng Process.Start khi ứng dụng của bạn thoát.

Xem chương trình mẫu đơn giản này, máy tính sẽ ở lại mở:

using System.Diagnostics; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Process.Start(@"C:\windows\system32\calc.exe"); 
    } 
} 
+0

Bạn hoàn toàn chính xác, giả định của tôi đã bị che mờ bởi tốc độ, thật không may. Tôi đã cập nhật câu hỏi của mình cho phù hợp. –

5

Không có lý do gì khiến quá trình bắt đầu với Process.Start sẽ tự động chết khi trình khởi chạy thoát. Tôi đoán là bạn đang làm một cái gì đó kỳ lạ trong updater.

Tôi đã viết trình cập nhật thực hiện chính xác loại điều này trước đây và điều đó vẫn ổn.

Ví dụ:

Launcher.cs:

using System; 
using System.Diagnostics; 

class Launcher 
{ 
    static void Main() 
    { 
     Console.WriteLine("Launching launchee"); 
     Process.Start("Launchee.exe"); 
     Console.WriteLine("Launched. Exiting"); 
    } 
} 

Launchee.cs:

using System; 
using System.Threading; 

class Launchee 
{ 
    static void Main() 
    { 
     Console.WriteLine("  I've been launched!"); 
     Thread.Sleep(5000); 
     Console.WriteLine("  Exiting..."); 
    } 
} 

Compile cả trong số họ, riêng biệt, và chạy Launcher.exe. Quá trình "khởi chạy" chắc chắn kéo dài lâu hơn trình khởi chạy.

+0

Tiện ích cấu hình khởi chạy trình cập nhật là một ứng dụng biểu mẫu cửa sổ, có thể liên quan gì đến những gì tôi thấy không? –

+0

Tôi đang làm một điều tương tự, ứng dụng giao diện điều khiển của tôi đang bắt đầu quá trình java có kết nối mở qua ổ cắm và thậm chí sau khi phương thức chính của ứng dụng giao diện điều khiển trả lại giá trị (kiểu trả về int) giao diện điều khiển không bị đóng . Tôi đoán cho đến khi quá trình java đang chạy. bất kỳ ý tưởng? –

+0

@KyloRen: Không có [mcve], không thực sự. Tôi đề nghị bạn đăng một câu hỏi mới theo cách mà chúng tôi có thể tái sản xuất. –

0

Chỉ cần một ý nghĩ từ bộ nhớ sương mù của tôi, nhưng tôi dường như nhớ có một cuộc thảo luận trong một thời gian lại rằng khi các phương pháp Process.Start là được gọi từ Mẫu mà quá trình sinh sản có một số loại phụ thuộc (không chắc chắn, tại sao hoặc làm thế nào, bộ nhớ là một chút sương mù).

Để giải quyết, cờ được đặt thực sự được gọi từ phương thức Main() của ứng dụng sau khi biểu mẫu/ứng dụng chính thoát ra và nếu quá trình được khởi chạy từ phương thức Main(), eveything đã hoạt động bình thường. Chỉ cần một ý nghĩ, như tôi đã nói, đây là hoàn toàn từ bộ nhớ, nhưng một số ví dụ được đăng ở đây tất cả được gọi từ phương thức Main() của một ứng dụng giao diện điều khiển dường như chạy một cái gì đó.

Hy vọng tất cả hoạt động tốt cho bạn.

+1

Tôi đã không thể tái tạo một hành vi như vậy và tôi sẽ thực sự ngạc nhiên nếu đây là trường hợp. Một tiến trình con thường sẽ không thông báo nếu nó chết (và đây là một điều cấp hệ điều hành), trừ khi bạn đã thực hiện một hành vi đặc biệt trong quá trình cha mẹ để giết tất cả trẻ em. –

+0

Tôi đã có cùng một giả định, dường như ký ức của chúng tôi đang sử dụng một số loại IPC tâm linh hoặc một cái gì đó :) –