前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >import duties(Python import变量)

import duties(Python import变量)

作者头像
全栈程序员站长
发布2022-07-31 11:40:43
1.1K0
发布2022-07-31 11:40:43
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

最近在读《编程之美》,打算用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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档