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

C# 如何在unix系统上使dotnet核心库可从dlopen加载,c#,linux,.net-core,dlopen,garrys-mod,C#,Linux,.net Core,Dlopen,Garrys Mod,因此,我将制作一个gmod模块来异步一些任务,并通常使服务器运行得更好更快 我想在c#中实现这一点(因此我不必编写大型跨平台包装,也不需要花费数小时来编写20分钟在c#中可以完成的工作),但我不知道有哪种跨平台库支持本机加载和本机导出。我知道这只适用于windows.Net Framework,而不适用于Linux,甚至不适用于没有自定义coreclr的dotnet core [DllExport(“gmod13_close”,CallingConvention=CallingConventio

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

我想在c#中实现这一点(因此我不必编写大型跨平台包装,也不需要花费数小时来编写20分钟在c#中可以完成的工作),但我不知道有哪种跨平台库支持本机加载和本机导出。我知道这只适用于windows.Net Framework,而不适用于Linux,甚至不适用于没有自定义coreclr的dotnet core

[DllExport(“gmod13_close”,CallingConvention=CallingConvention.Cdecl)]
公共静态Int32关闭(IntPtr LuaBasePtr)
{
返回0;
}
[DllExport(“gmod13_open”,CallingConvention=CallingConvention.Cdecl)]
公共静态Int32打开(lua_状态LuaState)
{
返回0;
}

如果在没有解决方法的情况下,dlopen无法直接加载它,那么使用它可以获得什么解决方法。

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

出于类似的原因,Java也不可能做到这一点,除非您使用的是类似于GCJ的编译为本机代码的东西

一般来说,如果您试图针对Linux系统,则.NET不是一个好的环境,因为它的设计不适合在那里工作(它确实可以工作,但集成度很差),并且不同的发行版包含不同的运行时(Mono vs.NET Core)。用户也不太可能安装它,因此它通常会给您的软件添加一个大的(通常是不希望的)依赖项


如果您真的想这样做,那么在CoreCLR树中就有这样的方法。请注意,这取决于.NET内核,因此它无法在Mono上运行,因此,如果没有其他软件,它无法在Debian或Ubuntu上运行。

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

出于类似的原因,Java也不可能做到这一点,除非您使用的是类似于GCJ的编译为本机代码的东西

一般来说,如果您试图针对Linux系统,则.NET不是一个好的环境,因为它的设计不适合在那里工作(它确实可以工作,但集成度很差),并且不同的发行版包含不同的运行时(Mono vs.NET Core)。用户也不太可能安装它,因此它通常会给您的软件添加一个大的(通常是不希望的)依赖项


如果您真的想这样做,那么在CoreCLR树中就有这样的方法。请注意,这取决于.NET Core,因此它在Mono上不起作用,因此如果没有其他软件,在Debian或Ubuntu上也不起作用。

您是否正在尝试在C#中创建与C兼容的库?Garry的Mod是用.NET编写的,还是非.NET程序?@bk2204 im试图制作一个c#dotnet核心dll,该dll具有可供c/c++程序读取的可访问导出。(在linux中)是否尝试在C#中创建与C兼容的库?Garry的Mod是用.NET编写的,还是非.NET程序?@bk2204 im试图制作一个c#dotnet核心dll,该dll具有可供c/c++程序读取的可访问导出。(在linux中)我将尝试并使用它,我可以(使用ExecuteManagedAssembly函数)调用dll,就像调用控制台exe一样,我将解析指向我需要的本机结构的指针,我认为我可以让它几乎无缝地工作,如果我让它工作,我将发布一个快速代码转储并将其标记为awnserd。我将尝试并使用它,我可以(使用executemagedassembly函数)调用dll,就好像它是一个控制台exe,我将解析指向我需要的本机结构的指针,我认为我可以让它几乎无缝地工作,如果我让它工作,我将发布一个快速代码转储并将其标记为awnserd。