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

Bagaimana untuk Menguruskan Objek Kerja dalam .NET Menggunakan Pinvoke?

DDD
Lepaskan: 2024-12-31 15:44:13
asal
309 orang telah melayarinya

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);
Salin selepas log masuk

Mencipta Pekerjaan Objek

Untuk mencipta objek kerja, gunakan CreateJobObject:

var handle = CreateJobObject(IntPtr.Zero, null);
Salin selepas log masuk

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()));
Salin selepas log masuk

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);
Salin selepas log masuk

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;
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan