Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menguruskan Objek Kerja dalam .NET Menggunakan Pinvoke?

Bagaimana untuk Menguruskan Objek Kerja dalam .NET Menggunakan Pinvoke?

DDD
DDDasal
2024-12-31 15:44:13288semak imbas

How to Manage Job Objects in .NET Using Pinvoke?

Pinvoking CreateJobObject/SetInformationJobObject dalam .NET

Mendefinisikan Kaedah Pinvoke

Kaedah Pinvoke berikut menyediakan akses kepada fungsi asli yang diperlukan untuk pengurusan objek kerja:

[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
static extern IntPtr CreateJobObject(IntPtr a, string lpName);

[DllImport("kernel32.dll")]
static extern bool SetInformationJobObject(IntPtr hJob, JobObjectInfoType infoType, IntPtr lpJobObjectInfo, UInt32 cbJobObjectInfoLength);

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool AssignProcessToJobObject(IntPtr job, IntPtr process);

[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool CloseHandle(IntPtr hObject);

Mencipta Pekerjaan Objek

Untuk mencipta objek kerja, gunakan CreateJobObject:

var handle = CreateJobObject(IntPtr.Zero, null);

Menetapkan Maklumat Objek Kerja

Untuk menetapkan maklumat untuk objek kerja, gunakan SetInformationJobObject:

var info = new JOBOBJECT_BASIC_LIMIT_INFORMATION { LimitFlags = 0x2000 };
var extendedInfo = new JOBOBJECT_EXTENDED_LIMIT_INFORMATION { BasicLimitInformation = info };
int length = Marshal.SizeOf(typeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION));
IntPtr extendedInfoPtr = Marshal.AllocHGlobal(length);
Marshal.StructureToPtr(extendedInfo, extendedInfoPtr, false);
if (!SetInformationJobObject(handle, JobObjectInfoType.ExtendedLimitInformation, extendedInfoPtr, (uint)length))
    throw new Exception(string.Format("Unable to set information.  Error: {0}", Marshal.GetLastWin32Error()));

Menambahkan Proses pada Objek Kerja

Untuk menambah proses pada kerja objek, gunakan AssignProcessToJobObject:

bool AddProcess(IntPtr processHandle) => AssignProcessToJobObject(handle, processHandle);
bool AddProcess(int processId) => AddProcess(Process.GetProcessById(processId).Handle);

Melupuskan Objek Kerja

Lupuskan objek kerja menggunakan pelaksanaan Boleh guna tersuai:

public void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}

private void Dispose(bool disposing)
{
    if (disposed)
        return;

    if (disposing) { }

    Close();
    disposed = true;
}

public void Close()
{
    CloseHandle(handle);
    handle = IntPtr.Zero;
}

Dengan menggunakan pelaksanaan ini, anda boleh mencipta, mengkonfigurasi dan mengurus objek kerja dengan berkesan dalam aplikasi .NET anda.

Atas ialah kandungan terperinci Bagaimana untuk Menguruskan Objek Kerja dalam .NET Menggunakan Pinvoke?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn