c#调用so

在 Linux 下,.NET Core 或 .NET 5+ 支持通过 P/Invoke(Platform Invoke)技术调用本地库(通常是 `.so` 文件)。这种方法允许您在托管的 C# 代码中调用非托管的 C/C++ 代码。

以下是一个简单的示例,展示如何在 Linux 下的 C# 代码中调用一个简单的 `.so` 库文件中的函数。

### 步骤 1:创建一个简单的 C 库

首先,创建一个简单的 C 库,用于演示调用过程。假设我们要创建一个名为 `example.so` 的库文件,其中包含一个打印字符串的函数。

#### 创建 C 头文件 `example.h`

```c
#ifndef EXAMPLE_H
#define EXAMPLE_H

// 定义一个 C 函数
extern void print_message(const char *message);

#endif
```

#### 创建 C 源文件 `example.c`

```c
#include <stdio.h>
#include "example.h"

void print_message(const char *message) {
printf("%s\n", message);
}
```

#### 编译 C 库

使用 GCC 编译 C 源文件,生成共享对象文件 `.so`。

```bash
gcc -shared -o example.so example.c -fPIC
```

### 步骤 2:创建 C# 项目并调用 `.so` 库

接下来,创建一个 C# 控制台应用程序,并在其中调用上面创建的 `.so` 库。

#### 创建 C# 项目

打开 Visual Studio Code 或其他编辑器,并创建一个新的 C# 控制台应用程序。

```bash
mkdir ExampleApp
cd ExampleApp
dotnet new console
```

#### 引入 `.so` 库

编辑 `Program.cs` 文件,添加必要的 P/Invoke 代码。

```csharp
using System;
using System.Runtime.InteropServices;

namespace ExampleApp
{
class Program
{
// 指定库文件的名称
private const string LibName = "example";

// 声明 P/Invoke 函数
[DllImport(LibName, EntryPoint = "print_message", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern void PrintMessage(string message);

static void Main(string[] args)
{
// 调用 C 库中的函数
PrintMessage("Hello from C#!");

Console.WriteLine("Called C function from C#.");
}
}
}
```

### 步骤 3:设置环境变量

确保 `.so` 文件所在目录包含在 `LD_LIBRARY_PATH` 环境变量中,以便程序能够找到库文件。

```bash
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/your/library/directory
```

### 步骤 4:编译并运行 C# 应用程序

编译并运行 C# 应用程序:

```bash
dotnet build
dotnet run
```

如果一切正常,您应该会在控制台看到输出的信息。

### 完整示例

下面是完整的示例代码,包括 C 头文件、源文件和 C# 代码。

#### `example.h`

```c
#ifndef EXAMPLE_H
#define EXAMPLE_H

// 定义一个 C 函数
extern void print_message(const char *message);

#endif
```

#### `example.c`

```c
#include <stdio.h>
#include "example.h"

void print_message(const char *message) {
printf("%s\n", message);
}
```

#### 编译 C 库

```bash
gcc -shared -o example.so example.c -fPIC
```

#### `Program.cs`

```csharp
using System;
using System.Runtime.InteropServices;

namespace ExampleApp
{
class Program
{
// 指定库文件的名称
private const string LibName = "example";

// 声明 P/Invoke 函数
[DllImport(LibName, EntryPoint = "print_message", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern void PrintMessage(string message);

static void Main(string[] args)
{
// 调用 C 库中的函数
PrintMessage("Hello from C#!");

Console.WriteLine("Called C function from C#.");
}
}
}
```

### 总结

以上示例展示了如何在 Linux 下的 C# 代码中通过 P/Invoke 调用一个简单的 `.so` 库文件。通过这种方式,您可以轻松地将本地 C/C++ 代码集成到您的 .NET Core 或 .NET 5+ 应用程序中。如果您需要调用更复杂的库,可以根据需要扩展上述示例。

posted @ 2024-09-26 17:11  China Soft  阅读(149)  评论(0编辑  收藏  举报