如何使 dotnet 核心库可从 unix 系统上的 dlopen 加载



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

我想用 c# 做这个(所以我不必写一个大的跨平台包装器,也不需要几个小时来编写 20 分钟在 c# 中可以做的事情(,但我不知道任何支持本机加载和本机导出的跨平台库。我知道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(。 用户也不太可能安装它,因此它通常会为您的软件添加大量(通常是不需要的(依赖项。

如果您确实要执行此操作,可以在 CoreCLR 树中提供用于执行此类操作的示例代码。 请注意,这取决于.NET Core,因此它不适用于Mono,因此如果没有其他软件,则无法在Debian或Ubuntu上运行。

最新更新