Как сделать так, чтобы библиотека ядра dotnet загружалась из dlopen в системе Unix - PullRequest
0 голосов
/ 08 октября 2019

поэтому я собираюсь создать модуль gmod для асинхронизации нескольких задач и, как правило, заставить сервер работать лучше и быстрее.

Я хочу сделать это в c # (так что мне не нужнонаписать большую кроссплатформенную оболочку, и не нужно часов, чтобы написать, что могут делать 20 минут в c #), но я не знаю ни одной кроссплатформенной библиотеки, которая бы поддерживала собственную загрузку и собственный экспорт. Я знаю, что DllExport работает, но только для Windows .Net Framework, а не для Linux или даже просто для ядра dotnet без настраиваемого coreclr.

[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 без какого-либо обходного пути, какой обходной путь я могу получить, просто используя это.

1 Ответ

2 голосов
/ 08 октября 2019

Вы не можете написать C-совместимую разделяемую библиотеку напрямую в .NET в системе Unix. C #, как и другие языки .NET, является управляемым кодом: у него есть сборщик мусора и интерпретируемая среда выполнения. Чтобы написать динамически загружаемый модуль, используемый в Linux, вам нужно написать на языке, который компилируется в машинный код (например, C, C ++ или Rust) или использовать код-обертку, который запускает среду выполнения .NET и вызывает функциюты хочешь позвонить. Это может произойти в Windows из-за COM, но не в Unix или Linux.

По аналогичным причинам, это невозможно сделать с Java, если вы не используете что-токак GCJ, который компилируется в нативный код.

В целом .NET не является хорошей средой, если вы пытаетесь ориентироваться на системы Linux, потому что она не предназначена для хорошей работы там (она работает, но этоплохо интегрируется) и разные дистрибутивы включают разные среды выполнения (Mono против .NET Core). Пользователи также вряд ли установят его, и, как правило, это добавляет большую (и часто нежелательную) зависимость к вашему программному обеспечению.

Если вы действительно хотите это сделать, есть пример кода за что-то подобное в дереве CoreCLR. Обратите внимание, что это зависит от .NET Core, поэтому он не будет работать на Mono и, следовательно, не будет работать на Debian или Ubuntu без дополнительного программного обеспечения.

...