首页 > 编程开发 > .NET    日期:2024-06-10 / 浏览

如何通过.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文件。

通过.net core调用so文件的方法

觉得上面的内容有用吗?快来点个赞吧!

点赞() 我要打赏

温馨提示 : 本站内容来自会员投稿以及互联网,所有源码及教程均为作者总结编辑,请大家在使用过程中提前做好备份,以免发生无法预知的错误,源码类教程请勿直接用于生产环境!

 可能感兴趣的文章

1 2 3 4 5