Loading color scheme

How to Call P/Invoke in C# on Linux

Platform Invocation Services (P/Invoke) is a feature in .NET that allows managed code to call unmanaged functions implemented in dynamic link libraries (DLLs) or shared objects (SOs). While traditionally used in Windows environments, P/Invoke is equally powerful on Linux. This article will guide you through the process of using P/Invoke in C# on Linux.

 

Prerequisites

  • .NET SDK installed on your Linux machine. You can download it from the official .NET download page.
  • A basic understanding of C# and unmanaged code concepts.

Step-by-Step Guide

1. Create a Shared Library

First, you need a shared library written in a language like C or C++. Here’s a simple example in C:

// hello.c
#include 

void say_hello() {
    printf("Hello from C!\n");
}

Compile this code into a shared object:

gcc -shared -o libhello.so -fPIC hello.c

This command generates a shared object file named libhello.so.

2. Create a C# Project

Create a new .NET console application:

dotnet new console -o PInvokeDemo
cd PInvokeDemo

3. Define the P/Invoke Signature in C#

In your Program.cs, define the P/Invoke signature and call the unmanaged function:

using System;
using System.Runtime.InteropServices;

class Program
{
    // P/Invoke signature
    [DllImport("libhello.so")]
    public static extern void say_hello();

    static void Main(string[] args)
    {
        // Call the unmanaged function
        say_hello();
    }
}

The DllImport attribute specifies the name of the shared library. Note that on Linux, the library name is case-sensitive and typically starts with lib and ends with .so.

4. Run the Project

Restore the project dependencies and run it:

dotnet restore
dotnet run

If everything is set up correctly, you should see the output:

Hello from C!

Additional Tips

  • Library Path: Ensure that the shared object (libhello.so) is in a directory that the runtime can find. You can place it in the same directory as the executable or set the LD_LIBRARY_PATH environment variable to include the directory where libhello.so is located.
  • Error Handling: If you encounter errors, ensure that the library is correctly named and accessible. Use tools like ldd to check the dependencies of your shared object.
    ldd libhello.so
  • Complex Data Types: For more complex data types or structures, you might need to define corresponding C# structures and use marshaling to handle the data correctly.

Conclusion

Using P/Invoke in C# on Linux allows you to leverage existing unmanaged code libraries, enhancing the functionality and interoperability of your applications. With the steps outlined above, you can start integrating C libraries into your .NET applications on Linux with ease.

Linux

Get all interesting articles to your inbox
Please wait