You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core中Linux平台下DllImport的等效替代方案是什么?

嘿,别找什么"SoImport"啦!其实你熟悉的DllImport在Linux上完全能用,只是把目标文件从.dll换成.so就搞定了——这就是官方推荐的快速解决方案,我给你一步步拆解开,附清晰示例:

核心结论:.NET Core在Linux上用DllImport调用.so库就够了

首先明确:没有专门的"SoImport"特性,但DllImport是跨平台的,Linux下它会自动去查找对应的.so共享库,完全满足你的需求,不用折腾其他复杂工具。

第一步:编译C++共享库(.so文件)

先写一个简单的C示例库,注意必须用extern "C"包裹函数,避免C的名字修饰(name mangling),否则.NET会找不到函数:

// mathlib.cpp
extern "C" {
    // 简单的加法函数
    int Add(int a, int b) {
        return a + b;
    }

    // 乘法函数
    double Multiply(double x, double y) {
        return x * y;
    }
}

然后用g++编译成.so文件,执行以下命令:

g++ -shared -fPIC -o libmathlib.so mathlib.cpp

参数解释:

  • -shared:生成共享库(而非可执行文件)
  • -fPIC:生成位置无关代码(Linux共享库的强制要求)
  • -o libmathlib.so:指定输出文件名,Linux共享库惯例以lib开头,后缀为.so

第二步:.NET Core项目中调用.so库

新建一个.NET Core Console项目,在代码中用DllImport引用刚才的.so库,注意库名可以省略lib前缀和.so后缀,系统会自动匹配:

using System;
using System.Runtime.InteropServices;

namespace DotNetCallSoDemo
{
    class Program
    {
        // 引用libmathlib.so,这里只需要写"mathlib"
        [DllImport("mathlib")]
        private static extern int Add(int a, int b);

        [DllImport("mathlib")]
        private static extern double Multiply(double x, double y);

        static void Main(string[] args)
        {
            int sumResult = Add(10, 20);
            Console.WriteLine($"10 + 20 = {sumResult}");

            double multiplyResult = Multiply(3.5, 4);
            Console.WriteLine($"3.5 * 4 = {multiplyResult}");
        }
    }
}

第三步:运行程序的注意事项

  • 让.NET找到.so库:
    最简单的方式是把libmathlib.so复制到.NET程序的输出目录(比如bin/Debug/net6.0);或者设置环境变量LD_LIBRARY_PATH指向.so文件所在的目录:

    export LD_LIBRARY_PATH=/path/to/your/so/folder:$LD_LIBRARY_PATH
    

    之后再运行.NET程序:dotnet run

  • 架构匹配:
    确保C++库和.NET程序的CPU架构一致(比如都是x64,或者都是arm64),否则会出现加载错误。

  • 复杂类型处理(可选):
    如果需要传递字符串、结构体等复杂类型,需要用MarshalAs等特性做类型映射,比如字符串可以这样:

    [DllImport("mathlib")]
    [return: MarshalAs(UnmanagedType.LPStr)]
    private static extern string GetHelloMessage();
    

    对应的C++函数:

    extern "C" {
        const char* GetHelloMessage() {
            return "Hello from C++!";
        }
    }
    

其他可选方案(不推荐新手)

如果不想用P/Invoke(即DllImport),还有比如用C++/CLI(但Linux支持有限)、或者用SWIG生成绑定代码,但这些都比DllImport复杂得多,对于快速实现需求来说,DllImport是最优解。

内容的提问来源于stack exchange,提问作者Daan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:42:44