目录
- 如何通过.net core调用so文件
- 代码
- C代码和编译
- C#代码
如何通过.net core调用so文件
工作中需要在linux上监控系统空闲时间,但是没有找到C#代码,只找到C的代码,所以准备将C文件编译为so然后用P/invoke调用。
代码
C代码和编译
#include <X11/extensions/scrnsaver.h>
#include <stdio.h>
int main(void) {
printf("%u\n", getIdleTime());
}
int getIdleTime(){
Display *dpy = XOpenDisplay(NULL);
if (!dpy) {
return(1);
}
XScreenSaverInfo *info = XScreenSaverAllocInfo();
XScreenSaverQueryInfo(dpy, DefaultRootWindow(dpy), info);
return info->idle;
}
要编译上述代码需要先安装libX11-devel库
编译命令:
gcc getIdle.c -fPIC -shared -o getIdle.so -lXss -lX11
C#代码
internal class Program
{
[DllImport("getIdle.so", EntryPoint = "getIdleTime")]
private static extern IntPtr getIdleTime();
static void Main(string[] args)
{
var after = DateTime.Now.AddSeconds(10);
while (after >= DateTime.Now)
{
Console.WriteLine(GetIdleTime());
Thread.Sleep(1000);
}
}
/// <summary>
/// 调用getIdle.so获取系统空闲时间
/// </summary>
/// <returns></returns>
internal static int GetIdleTime()
{
return getIdleTime().ToInt32();
}
}
编译生成后,将程序文件夹中的文件复制到linux上,并将so文件放到程序目录下。使用bashdotnet Test.dll命令运行程序,可以看到能够正常调用so文件。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

评论(0)