将 dotnet core (.NET Core) 嵌入到 Windows/Linux 上的本机应用程序中

问题描述 投票:0回答:3

是否有可能将 dotnet core (.NET Core) 环境嵌入到本机进程中?

我的用例是现有的游戏服务器,我希望提供在 Windows 和 Linux 上使用 .NET Core 上的 C# 来扩展游戏的可能性。

额外问题:还会有像“oldschool”.NET 中那样的

AppDomain
概念吗?

c# linux windows coreclr .net-core
3个回答
1
投票

是的,绝对有可能。

我找到了这个带有示例的文档: .NET Core 托管教程

如果链接不再有效,请在网络上搜索“托管 .NET Core”。

关于 AppDomains ...我想不是。 如果您使用 CoreClrHost.h,您可以为默认 AppDomain 提供一个 ID,但它似乎是唯一的 AppDomain。为了隔离,您可以使用单独的进程。也许 AssemblyLoadContext 类也可以对你有所帮助。


0
投票

AppDomain 不会进入 dotnet core。 AppDomain api 的部分内容将会出现,但与您所说的功能没有直接关系。我不相信您可以将 dotnet core 应用程序嵌入本机进程中,但是在本机进程中您可以启动 dotnet core 进程。


0
投票

我已经测试了嵌入式 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# 融入本机应用程序:)

© www.soinside.com 2019 - 2024. All rights reserved.