Вы не можете написать 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 без дополнительного программного обеспечения.