如何在 unix 系统上从 dlopen 加载 dotnet 核心库

How to make a dotnet core library loadable from dlopen on unix system

所以我将制作一个 gmod 模块来异步执行一些任务,并通常使服务器 运行 更好更快。

我想用 c# 来做这个(这样我就不必写一个大型的跨平台包装器,而且用 c# 写 20 分钟可以做的事情也不需要花几个小时)但我不想不知道任何支持本机加载和本机导出的跨平台库。我知道 DllExport 有效,但仅适用于 windows .Net Framework 而不是 Linux 甚至只是没有自定义 coreclr 的 dotnet 核心。

[DllExport("gmod13_close", CallingConvention = CallingConvention.Cdecl)]
public static Int32 Close(IntPtr LuaBasePtr)
{
    return 0;
}
[DllExport("gmod13_open", CallingConvention = CallingConvention.Cdecl)]
public static Int32 Open(lua_State LuaState)
{
    return 0;
}

如果没有一些变通办法就无法使它直接由 dlopen 加载,那么我可以通过使用它来获得什么变通办法。

您不能在 Unix 系统上直接在 .NET 中编写与 C 兼容的共享库。与其他 .NET 语言一样,C# 是托管代码:它具有垃圾收集器和解释运行时。为了编写可在 Linux 上使用的动态可加载模块,您需要使用可编译为机器代码(例如 C、C++ 或 Rust)的语言编写,或使用启动 .NET 运行时的包装代码并调用您要调用的函数。由于 COM,这可能会在 Windows 上工作,但它不会在 Unix 或 Linux.

上工作

出于类似的原因,也无法使用 Java 执行此操作,除非您使用的是 GCJ 之类的编译为本机代码的工具。

一般来说,如果您尝试针对 Linux 系统,.NET 不是一个好的环境,因为它的设计不是为了在那里很好地工作(它确实工作,但集成很差)并且不同发行版包括不同的运行时(Mono 与 .NET Core)。用户也不太可能安装它,因此它通常会给您的软件增加大量(通常是不需要的)依赖性。

如果您真的想这样做,example code 可以在 CoreCLR 树中执行类似的操作。请注意,这取决于 .NET Core,因此它无法在 Mono 上运行,因此在没有其他软件的情况下无法在 Debian 或 Ubuntu 上运行。