是否有可能将 dotnet core (.NET Core) 环境嵌入到本机进程中?
我的用例是现有的游戏服务器,我希望提供在 Windows 和 Linux 上使用 .NET Core 上的 C# 来扩展游戏的可能性。
额外问题:还会有像“oldschool”.NET 中那样的
AppDomain
概念吗?
是的,绝对有可能。
我找到了这个带有示例的文档: .NET Core 托管教程
如果链接不再有效,请在网络上搜索“托管 .NET Core”。
关于 AppDomains ...我想不是。 如果您使用 CoreClrHost.h,您可以为默认 AppDomain 提供一个 ID,但它似乎是唯一的 AppDomain。为了隔离,您可以使用单独的进程。也许 AssemblyLoadContext 类也可以对你有所帮助。
AppDomain 不会进入 dotnet core。 AppDomain api 的部分内容将会出现,但与您所说的功能没有直接关系。我不相信您可以将 dotnet core 应用程序嵌入本机进程中,但是在本机进程中您可以启动 dotnet core 进程。
我已经测试了嵌入式 GUI 或窗口系统,您可以嵌入到静态可执行文件中。首先使用 Alpine 或 Void-Linux(通过共享文件夹使用 qemu guest )查看更多信息 https://github.com/dotnet/runtimelab/issues/2202
抱歉,我会在工作后改进我的答案。好的。我将向您解释如何嵌入 GUI 或游戏层框架(如 glfw 或 sdl2/3),但我使用 musl-gcc 和 dotnet 应用程序使用本机 aot。我希望你有关于 Alpine 或 Void-Linux 的经验。
//编辑:
AppDomain
-> Environment.CurrentDirectory
如果你想加载原生库(内置dotnet库)你需要通过
sbyte*
你应该使用
DeafMan1983.COnversion
示例:
[UnmanagedCallersOnly(EntryPoint = "SayHello")]
public static void SayHello(sbyte* message)
{
Console.WriteLine(StringFromSbytePointer(message));
}
您可以通过项目控制台加载和传递库,例如
dlopen
、dlsym
、dlclose
和 dlerror
抱歉,我只使用 Linux - 如果您使用 Windows thzan,您可以通过
LoadLibraryEx
、GetProcAddress
、FreeLibrary
等等...
您可以从我的存储库检查 NativeAot 的示例 AppWithPlugin,并享受快乐的编码!
我希望我的存储库可以帮助您将 C# 融入本机应用程序:)