Извикване на споделен обектен файл на UNIX и Linux .so от c#

Има ли начин файл със споделен обект, написан на 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 с clopen(). Мислех, че си спомням, че има начин, но след това не можах да го намеря, когато търсех и си помислих, че трябва да съм си въобразил. както за това как да направите това, което искате; Страхувам се, че не съм правил нищо подобно. Но ще добавя към отговора си, че може да се направи (очевидно лесно) в linux/Mono. - person shelleybutterfly; 17.08.2011