程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

import duties(Python import變量)

編輯:Python

大家好,又見面了,我是你們的朋友全棧君。

最近在讀《編程之美》,打算用C#實現其中一個題目,就是如何控制CPU的使用率在50%,使得在資源管理器中CPU利用率維持在一條直線。單核的還容易辦到,但是現在的機器一般都是多核的,這樣就需要調用Win32 API SetThreadAffinityMask 來給線程制定CPU去執行。但這個API只能在C++調用,那麼在C#裡如何調用呢?更進一步,就是在C#裡為什麼沒有全部的WIN32 API可以調用呢?有沒有方法可以實現呢?

讀了一堆C#的帖子和GOOGLE了一通後,發現了原因。當框架小組構建他們的 .NET 部分時,他們評估了為使 .NET 程序員可以使用 Win32 而需要完成的工作,結果發現 Win32 API 集非常龐大。他們沒有足夠的資源為所有 Win32 API 編寫托管接口、加以測試並編寫文檔,因此只能優先處理最重要的部分。許多常用操作都有托管接口,但是還有許多完整的 Win32 部分沒有托管接口。

那麼用什麼方法呢?平台調用 (P/Invoke) 是完成這一任務的最常用方法。要使用 P/Invoke,您可以編寫一個描述如何調用函數的原型,然後運行時將使用此信息進行調用。其實就是用DllImport來聲明屬性和API,然後直接在C#裡調用。

步驟是:

1)聲明調用的API

[DllImport(“DllSample.dll”, CharSet = CharSet.Auto, SetLastError = true)] static extern int SetProcessInfo( IntPtr id, UIntPtr cpu, ref int modify );

2)在C#裡調用

int i, cpuCount, modify ;

IntPtr mask = new IntPtr(i); UIntPtr cpu = new UIntPtr(&cpuCount);

int result = SetProcessInfo(mask, cpu, ref modify);

在這裡解釋一下其中的要點,主要是我在使用的過程中碰到問題。

1)使用的那個DLL,可以是系統提供API的DLL,也可以使自己實現的DLL.

如果是自己的實現的DLL,函數的聲明和實現方式如下:

extern “C” _declspec(dllexport) int WINAPI SetProcessInfo( int id, int* value, int* modify ) { int a = id; //傳進來的值 int b = *value; //傳進來的是地址

*modify = 9; //可以更改外部的值 return b; }

2)SetLastError = true 這句話的作用是參數指示方法是否保留 Win32″上一錯誤”。如果你調用的過程中得不到預想的結果,而且也沒拋異常,可以用Marshal.GetLastWin32Error()來得到錯誤號。

3)針對參數類型,我的理解是:

a)如果參數是基本類型,則為值傳遞;

b)如果參數是指針

i)在調用時為變量的地址,則為指針傳遞。但這種情況要求調用者的context的為unsafe的。

ii)在調用時為ref 加變量名,則為引用傳遞,這種情況不需要unsafe的context。

因此,我認為DllImport主要解決的的問題有2個:

1)大量的Win32 API在.Net中沒有實現托管的那部分。

2)你自身的工程中原有的大量基礎庫實現可以重用,而不用c#重寫。

發布者:全棧程序員棧長,轉載請注明出處:https://javaforall.cn/128720.html原文鏈接:https://javaforall.cn


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved