Skip to main content
Redhat Developers  Logo
  • Products

    Featured

    • Red Hat Enterprise Linux
      Red Hat Enterprise Linux Icon
    • Red Hat OpenShift AI
      Red Hat OpenShift AI
    • Red Hat Enterprise Linux AI
      Linux icon inside of a brain
    • Image mode for Red Hat Enterprise Linux
      RHEL image mode
    • Red Hat OpenShift
      Openshift icon
    • Red Hat Ansible Automation Platform
      Ansible icon
    • Red Hat Developer Hub
      Developer Hub
    • View All Red Hat Products
    • Linux

      • Red Hat Enterprise Linux
      • Image mode for Red Hat Enterprise Linux
      • Red Hat Universal Base Images (UBI)
    • Java runtimes & frameworks

      • JBoss Enterprise Application Platform
      • Red Hat build of OpenJDK
    • Kubernetes

      • Red Hat OpenShift
      • Microsoft Azure Red Hat OpenShift
      • Red Hat OpenShift Virtualization
      • Red Hat OpenShift Lightspeed
    • Integration & App Connectivity

      • Red Hat Build of Apache Camel
      • Red Hat Service Interconnect
      • Red Hat Connectivity Link
    • AI/ML

      • Red Hat OpenShift AI
      • Red Hat Enterprise Linux AI
    • Automation

      • Red Hat Ansible Automation Platform
      • Red Hat Ansible Lightspeed
    • Developer tools

      • Red Hat Trusted Software Supply Chain
      • Podman Desktop
      • Red Hat OpenShift Dev Spaces
    • Developer Sandbox

      Developer Sandbox
      Try Red Hat products and technologies without setup or configuration fees for 30 days with this shared Openshift and Kubernetes cluster.
    • Try at no cost
  • Technologies

    Featured

    • AI/ML
      AI/ML Icon
    • Linux
      Linux Icon
    • Kubernetes
      Cloud icon
    • Automation
      Automation Icon showing arrows moving in a circle around a gear
    • View All Technologies
    • Programming Languages & Frameworks

      • Java
      • Python
      • JavaScript
    • System Design & Architecture

      • Red Hat architecture and design patterns
      • Microservices
      • Event-Driven Architecture
      • Databases
    • Developer Productivity

      • Developer productivity
      • Developer Tools
      • GitOps
    • Secure Development & Architectures

      • Security
      • Secure coding
    • Platform Engineering

      • DevOps
      • DevSecOps
      • Ansible automation for applications and services
    • Automated Data Processing

      • AI/ML
      • Data Science
      • Apache Kafka on Kubernetes
      • View All Technologies
    • Start exploring in the Developer Sandbox for free

      sandbox graphic
      Try Red Hat's products and technologies without setup or configuration.
    • Try at no cost
  • Learn

    Featured

    • Kubernetes & Cloud Native
      Openshift icon
    • Linux
      Rhel icon
    • Automation
      Ansible cloud icon
    • Java
      Java icon
    • AI/ML
      AI/ML Icon
    • View All Learning Resources

    E-Books

    • GitOps Cookbook
    • Podman in Action
    • Kubernetes Operators
    • The Path to GitOps
    • View All E-books

    Cheat Sheets

    • Linux Commands
    • Bash Commands
    • Git
    • systemd Commands
    • View All Cheat Sheets

    Documentation

    • API Catalog
    • Product Documentation
    • Legacy Documentation
    • Red Hat Learning

      Learning image
      Boost your technical skills to expert-level with the help of interactive lessons offered by various Red Hat Learning programs.
    • Explore Red Hat Learning
  • Developer Sandbox

    Developer Sandbox

    • Access Red Hat’s products and technologies without setup or configuration, and start developing quicker than ever before with our new, no-cost sandbox environments.
    • Explore Developer Sandbox

    Featured Developer Sandbox activities

    • Get started with your Developer Sandbox
    • OpenShift virtualization and application modernization using the Developer Sandbox
    • Explore all Developer Sandbox activities

    Ready to start developing apps?

    • Try at no cost
  • Blog
  • Events
  • Videos

P/Invoke in .NET Core on Red Hat Enterprise Linux

September 14, 2016
Takayoshi Tanaka
Related topics:
Linux.NET
Related products:
Red Hat Enterprise Linux

Share:

    P/Invoke(Platform Invocation Service) is one of the features of CLI (Common Language Interface) on .NET Framework. P/Invoke enables managed code to call a native function in DLL (Dynamic Link Library). It's a powerful tool for .NET Framework to execute existing C-style functions easily. .NET Core also has a P/Invoke feature and it means we can call a native function in .so file (Linux) and . file (Max OSX). I will show you the short example P/Invoke in .NET Core on Red Hat Enterprise Linux (RHEL).

    Here is the simple P/Invoke sample using read function in libc. It is the same way as .NET Framework on Windows to import native function.

    using System;
    using System.Runtime.InteropServices;
    using System.Text;
    
    namespace ConsoleApplication
    {
        public class Program
        {
            [DllImport("libc")]
            static extern int read(int handle, byte[] buf, int n);
    
            public static void Main(string[] args)
            {
                Console.Write("Input value:");
                var buffer = new byte[100];
                read(0, buffer, 100);
                Console.WriteLine("Input value is:" + Encoding.UTF8.GetString(buffer));
            }
        }
    }

    [dllimport] is the attribute to import a native function. We can declare method name as a native function name, and declare method name as you like with specifying native function name in EntryPoint attribute value as below.

    [DllImport("libc", EntryPoint="read")]
    static extern int Read(int handle, byte[] buf, int n);

    We can read text from console input with native libc method.

    Next, I'd like to execute GUI sample written in .NET Core on RHEL. .NET Core doesn't have GUI Framework at this point. However, we can call GUI library such as gtk+ from managed code in .NET Core. At first, install the package.

    $ sudo yum install gtk3-devel

    Now we can call functions in gtk+ from C# code. Here is the whole code to open dialog from C#.

    using System;
    using System.Runtime.InteropServices;
    
    namespace ConsoleApplication
    {
        public class Program
        {
            [DllImport("libgtk-x11-2.0.so.0")]
            private static extern void gtk_init (ref int argc, ref IntPtr argv);
            [DllImport("libgtk-x11-2.0.so.0")]
            static extern IntPtr gtk_message_dialog_new(IntPtr parent_window, DialogFlags flags, MessageType type, ButtonsType bt, string msg, IntPtr args);
            [DllImport("libgtk-x11-2.0.so.0")]
            static extern int gtk_dialog_run(IntPtr raw);
            [DllImport("libgtk-x11-2.0.so.0")]
            static extern void gtk_widget_destroy(IntPtr widget);
            [Flags]
            public enum DialogFlags
            {
                Modal = 1 << 0,
                DestroyWithParent = 1 << 1,
            }
    
            public enum MessageType
            {
                Info,
                Warning,
                Question,
                Error,
                Other,
            }
    
            public enum ButtonsType
            {
                None,
                Ok,
                Close,
                Cancel,
                YesNo,
                OkCancel,
            }
    
            public static void Main(string[] args)
            {
                var argc = 0;
                var argv = IntPtr.Zero;
                gtk_init(ref argc, ref argv);
                var diag = gtk_message_dialog_new(IntPtr.Zero, DialogFlags.Modal, MessageType.Error, ButtonsType.Ok, "Hello from .NET Core on Red Hat!", IntPtr.Zero);
                var res = gtk_dialog_run(diag);
                gtk_widget_destroy(diag);
                Console.WriteLine(res);
            }
        }
    }

    Here is a result. The dialog is opened.

    dialog

    P/Invoke was a technology only for Windows platform, but now it enables many platforms to call native function easily from managed code. Of course, we shouldn't forget Mono, which enabled P/Invoke on Linux.

    For additional information and articles on .NET Core visit our .NET Core web page for more on this topic.

    Takayoshi Tanaka

    About the author:

    Takayoshi Tanaka is the Software Maintenance Engineer of Red Hat. He is mainly in charge of OpenShift, .NET Core on Red Hat Enterprise Linux and Red Hat solutions on Microsoft Azure. He is a Microsoft MVP for Visual Studio and Development Technologies. He writes many articles in his personal blogs, writes many web articles, and makes many technical sessions in community groups.

    Last updated: September 3, 2019

    Recent Posts

    • Meet the Red Hat Node.js team at PowerUP 2025

    • How to use pipelines for AI/ML automation at the edge

    • What's new in network observability 1.8

    • LLM Compressor: Optimize LLMs for low-latency deployments

    • How to set up NVIDIA NIM on Red Hat OpenShift AI

    Red Hat Developers logo LinkedIn YouTube Twitter Facebook

    Products

    • Red Hat Enterprise Linux
    • Red Hat OpenShift
    • Red Hat Ansible Automation Platform

    Build

    • Developer Sandbox
    • Developer Tools
    • Interactive Tutorials
    • API Catalog

    Quicklinks

    • Learning Resources
    • E-books
    • Cheat Sheets
    • Blog
    • Events
    • Newsletter

    Communicate

    • About us
    • Contact sales
    • Find a partner
    • Report a website issue
    • Site Status Dashboard
    • Report a security problem

    RED HAT DEVELOPER

    Build here. Go anywhere.

    We serve the builders. The problem solvers who create careers with code.

    Join us if you’re a developer, software engineer, web designer, front-end designer, UX designer, computer scientist, architect, tester, product manager, project manager or team lead.

    Sign me up

    Red Hat legal and privacy links

    • About Red Hat
    • Jobs
    • Events
    • Locations
    • Contact Red Hat
    • Red Hat Blog
    • Inclusion at Red Hat
    • Cool Stuff Store
    • Red Hat Summit

    Red Hat legal and privacy links

    • Privacy statement
    • Terms of use
    • All policies and guidelines
    • Digital accessibility

    Report a website issue