Bài đăng này nhằm mục đích mở rộng cho câu trả lời của @Matt Howells, đặc biệt dành cho những người gặp vấn đề với việc sử dụng Đối tượng công việc trong Vista hoặc Win7 , đặc biệt nếu bạn gặp lỗi từ chối truy cập ('5') khi gọi AssignProcessToJobObject.
tl; dr
Để đảm bảo khả năng tương thích với Vista và Win7, hãy thêm tệp kê khai sau vào quy trình cha mẹ .NET:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<v3:trustInfo xmlns:v3="urn:schemas-microsoft-com:asm.v3">
<v3:security>
<v3:requestedPrivileges>
<v3:requestedExecutionLevel level="asInvoker" uiAccess="false" />
</v3:requestedPrivileges>
</v3:security>
</v3:trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<!-- We specify these, in addition to the UAC above, so we avoid Program Compatibility Assistant in Vista and Win7 -->
<!-- We try to avoid PCA so we can use Windows Job Objects -->
<!-- See https://stackoverflow.com/questions/3342941/kill-child-process-when-parent-process-is-killed -->
<application>
<!--The ID below indicates application support for Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!--The ID below indicates application support for Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
</application>
</compatibility>
</assembly>
Lưu ý rằng khi bạn thêm tệp kê khai mới trong Visual Studio 2012, nó sẽ chứa đoạn mã ở trên, do đó bạn không cần phải sao chép nó từ nghe. Nó cũng sẽ bao gồm một nút cho Windows 8.
giải thích đầy đủ
Hiệp hội công việc của bạn sẽ thất bại với lỗi từ chối truy cập nếu quá trình bạn bắt đầu đã được liên kết với một công việc khác. Nhập Trợ lý Tương thích Chương trình, bắt đầu trong Windows Vista, sẽ chỉ định tất cả các loại quy trình cho công việc của chính nó.
Trong Vista, bạn có thể đánh dấu ứng dụng của mình bị loại khỏi PCA bằng cách bao gồm một bảng kê khai ứng dụng. Visual Studio dường như tự động làm điều này cho các ứng dụng .NET, vì vậy bạn vẫn ổn ở đó.
Một bảng kê khai đơn giản không còn cắt nó trong Win7. [1] Ở đó, bạn phải xác định cụ thể rằng bạn tương thích với Win7 với thẻ trong bảng kê khai của bạn. [2]
Điều này khiến tôi lo lắng về Windows 8. Tôi có phải thay đổi bảng kê khai một lần nữa không? Rõ ràng có một sự phá vỡ trong các đám mây, vì Windows 8 bây giờ cho phép một quá trình thuộc về nhiều công việc. [3] Vì vậy, tôi chưa thử nghiệm nó, nhưng tôi tưởng tượng rằng sự điên rồ này sẽ chấm dứt ngay bây giờ nếu bạn chỉ đơn giản bao gồm một bảng kê khai với thông tin được hỗ trợ.
Mẹo 1 : Nếu bạn đang phát triển ứng dụng .NET với Visual Studio, như tôi đã từng, thì đây là một số hướng dẫn hay về cách tùy chỉnh bảng kê khai ứng dụng của bạn.
Mẹo 2 : Hãy cẩn thận với việc khởi chạy ứng dụng của bạn từ Visual Studio. Tôi thấy rằng, sau khi thêm bản kê khai phù hợp, tôi vẫn gặp vấn đề với PCA khi khởi chạy từ Visual Studio, ngay cả khi tôi đã sử dụng Bắt đầu mà không gỡ lỗi. Tuy nhiên, việc khởi chạy ứng dụng của tôi từ Explorer đã hoạt động. Sau khi thêm thủ công devenv để loại trừ khỏi PCA bằng cách sử dụng sổ đăng ký, bắt đầu các ứng dụng sử dụng Đối tượng công việc từ VS cũng bắt đầu hoạt động. [5]
Mẹo 3 : Nếu bạn muốn biết PCA có phải là vấn đề của mình không, hãy thử khởi chạy ứng dụng của bạn từ dòng lệnh hoặc sao chép chương trình vào ổ đĩa mạng và chạy nó từ đó. PCA được tự động vô hiệu hóa trong các bối cảnh đó.
[1] http://bloss.msdn.com/b/cjacks/archive/2009/06/18/pca-changes-for-windows-7-how-to-tell-us-you-are-not-an -installer-Take-2-vì-chúng tôi đã thay đổi-quy tắc-on-you.aspx
[2] http://ayende.com/blog/4360/how-to-opt-out-of-program-compabilities-assistant
[3] http://msdn.microsoft.com/en-us/l Library / windows / desktop / ms681949 (v = vs85) .aspx : "Một quy trình có thể được liên kết với nhiều hơn một công việc trong Windows 8"
[4] Làm cách nào tôi có thể nhúng một bảng kê khai ứng dụng vào một ứng dụng bằng VS2008?
[5] Làm cách nào để ngăn chặn trình gỡ lỗi Visual Studio bắt đầu quá trình của tôi trong một đối tượng công việc?