如何通过.net core调用so文件
工作中需要在linux上监控系统空闲时间,但是没有找到C#代码,只找到C的代码,所以准备将C文件编译为so然后用P/invoke调用。
代码
C代码和编译
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include #include int main( void ) { printf( "%un" , getIdleTime()); } int getIdleTime(){ Display *dpy = XOpenDisplay(NULL); if (!dpy) { return (1); } XScreenSaverInfo *info = XScreenSaverAllocInfo(); XScreenSaverQueryInfo(dpy, DefaultRootWindow(dpy), info); return info->idle; } |
要编译上述代码需要先安装libX11-devel库
编译命令:
1 | gcc getIdle.c -fPIC -shared -o getIdle.so -lXss -lX11 |
C#代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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> /// internal static int GetIdleTime() { return getIdleTime().ToInt32(); } } |
编译生成后,将程序文件夹中的文件复制到linux上,并将so文件放到程序目录下。使用bashdotnet Test.dll
命令运行程序,可以看到能够正常调用so文件。
到此这篇关于如何通过.net core调用so文件的文章就介绍到这了,更多相关.net core调用so文件内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!