Вызов общего объектного файла UNIX и Linux .so из С#

Есть ли способ, чтобы файл Shared Object, написанный на C и построенный на Unix, вызывался из C# P/Invoke?

Или мне нужно использовать Java или что-то в этом роде?


person Natasha Thapa    schedule 16.08.2011    source источник
comment
пожалуйста, предоставьте дополнительную информацию... C# работает в Mono/Linux или в Windows?   -  person Yahia    schedule 16.08.2011
comment
вы здесь говорите о Mono на GNU/linux? или пытаетесь сделать это в Windows?   -  person shelleybutterfly    schedule 16.08.2011
comment
Файл .so принадлежит вам или третьей стороне? Если у вас есть, рассмотрите возможность переноса на Windows DLL; если третье лицо, попробуйте найти сборку Windows.   -  person Seva Alekseyev    schedule 16.08.2011
comment
файл .so принадлежит мне, и я планировал запустить его в Windows.   -  person Natasha Thapa    schedule 16.08.2011
comment
Запуск Windows .dll в Windows (через C# Interop/DllImport) допустим. Запуск Linux .so в Linux также допустим: mono-project.com/Interop_with_Native_Libraries. Но запустить .dll в Linux или общий объект Linux в Windows почти наверняка не удастся.   -  person paulsm4    schedule 16.08.2011
comment
будет ли Java лучшим решением для меня? я пытаюсь обернуть устаревший код и раскрыть его с помощью веб-сервисов. Разместите службы Java на самом устройстве Unix в каталоге tomcat/weblogic.   -  person Natasha Thapa    schedule 16.08.2011


Ответы (2)


Mono имеет возможность интегрироваться с собственными библиотеками из C#, созданного поверх dlopen(3). Вам просто нужно использовать оператор DllImport с именем библиотеки (например, «libform.so.5»), а затем обернуть собственный код и типы данных дружественным классом C#, который позаботится обо всех низкоуровневых вещах. Эта страница содержит хороший обзор с большим количеством информации о том, как обращаться с указателями маршалинга и другими небезопасными типами. .

После того, как вы написали свой класс-оболочку, вы можете просто использовать его, не беспокоясь о том, что он использует встроенную общую библиотеку.

person James O'Doherty    schedule 16.08.2011
comment
+1 это круто, не знаю, как я пропустил это, когда искал. я даже просмотрел сайт Mono, пытаясь найти его. :| - person shelleybutterfly; 17.08.2011

Я бы сказал, что, по крайней мере, простого пути не будет, особенно если вы имеете в виду C# в Windows. В этом случае вам понадобится что-то, что сможет декодировать общий объект и добраться до кода в нем, своего рода повторная реализация ABI для GNU/linux. Кроме того, должны присутствовать и использоваться любые другие библиотеки, такие как библиотека времени выполнения C и тому подобное. Вероятно, это будет очень серьезное усилие.

Что касается того, чтобы сделать это непосредственно под linux/Mono, см. этот ответ: Вызов общего объектного файла UNIX и Linux .so из c# .

Вы также можете попробовать посмотреть, что делает open office, http://packages.debian.org/lenny/cli-uno-bridge может пригодиться; но это скорее интерфейс, а не прямая связь между ними.

person shelleybutterfly    schedule 16.08.2011
comment
будет ли Java лучшим решением для меня? я пытаюсь обернуть устаревший код и выставить его с помощью веб-сервисов и разместить службы Java на самом ящике Unix под tomcat/weblogic - person Natasha Thapa; 16.08.2011
comment
Java не был бы плохим выбором, но если вы пытаетесь разместить его в Unix/Linux, C# будет плохим выбором. Это не имеет никакого отношения к возможностям языка, а во многом связано с историей набора инструментов и концепцией поддерживаемых. Java с самого начала предназначалась для работы на Unix/Linux с работающими распределенными поддерживаемыми платформами. C# предназначался для работы в Unix/Linux без работы на распределенных поддерживаемых платформах. Хотя нескольким людям удалось собрать платформы для C#, они явно рекламируются как использование на свой страх и риск. - person Edwin Buck; 16.08.2011
comment
чтобы вы знали: похоже, мой ответ был неправильным; Ответ Джеймса О'Доэрти stackoverflow.com/questions/7072961/ есть, как это сделать в Linux с помощью cloopen(). Я думал, что помнил, что есть способ, но потом не смог найти его, когда искал, и подумал, что, должно быть, мне это показалось. что касается того, как делать то, что вы хотите; Боюсь, я ничего подобного не делал. Но я собираюсь добавить к своему ответу, что это можно сделать (очевидно, легко) в Linux/Mono. - person shelleybutterfly; 17.08.2011