Теоретически возможно получить доступ к любой библиотеке из C# (иначе говоря, что делает PInvoke под капотом)?

Как и во многих других местах, на моем рабочем месте наряду с более современными приложениями используется устаревший код. Например, у нас есть серверное приложение, которое по-прежнему использует компилятор Microsoft Fortran77. Менее старые части приложения написаны для компилятора Visual Studio 6 C, и в последнее время появились сообщения о написании некоторых новых библиотек с VS .Net 2008 C++. Программы/библиотеки имеют ряд различных механизмов для использования/общения друг с другом, включая статическую компоновку, общую память (сопоставленные файлы памяти Windows), каналы имен и сокеты TCP.

Что мешает приложению C# использовать любую старую библиотеку, например, одну из библиотек Fortran77, написанную на процедурном языке?

Если бы мое приложение на C# понимало формат файла библиотеки Fortan77 или C и могло найти нужный вызов процедуры, могло бы оно маршалировать управляемые объекты, вызывать процедуру и демаршалировать результат?

Если бы я скопировал файл библиотеки .so из Linux в Windows, и мое приложение C# поняло формат файла, могло ли бы оно вызывать функции из этой библиотеки?

Я думаю, что ответы связаны с различными средами выполнения Fortran, C и т. д., которые необходимы для инициализации каждой библиотеки/программы. Если это так, то на фундаментальном уровне эти среды выполнения в целом похожи на CLR (понимая, что они имеют разные функции, такие как управление памятью и т. д. и т. д. в случае CLR)?

Редактировать:

Если сформулировать мой вопрос иначе. Если бы пришелец пришел и дал мне файл двоичной библиотеки и спецификацию формата файла, мог бы я использовать его из C#?


person sipsorcery    schedule 02.04.2009    source источник


Ответы (3)


Если библиотеки DLL являются действительными библиотеками DLL, а экспортируемые функции используют общеизвестные соглашения о вызовах, то проблем не должно возникнуть, если вы правильно получаете сигнатуру метода в .NET, то есть: правильные типы аргументов и возвращаемый тип. CLR все равно (и не может) заботиться о том, на каком языке написана библиотека.

Что касается общих библиотек Linux, если у вас есть исходники библиотек, их можно будет скомпилировать для Windows с помощью Cygwin или MiniGW.

person arul    schedule 02.04.2009

Я не знаю о Fortan77 или библиотеке .so из Linux, но я знаю, что вы можете использовать PInvoike с библиотеками C для вызовов методов. Также вы можете посмотреть ключевое слово unsafe в C# для приложений с общей памятью. Это позволяет вам отказаться от управления памятью, что может быть вам нужно. Именованные каналы и сокеты TCP можно создавать из пространства имен System.Net.

В принципе, все, что вы сказали, можно сделать. Я не знаю, насколько сложно или легко это будет сделать, но вы должны иметь доступ ко всем этим нативным приложениям из своего приложения C#.

person Nick Berardi    schedule 02.04.2009

Вы также можете создать C++/CLI DLL (параметр /CLR при компиляции), что позволит вам писать как управляемый, так и неуправляемый код. Это позволяет вам делать почти все, что вы могли бы делать в родном C++, а также взаимодействовать с компонентами .NET. Я делаю что-то подобное, чтобы соединить старое приложение C с DLL C #, по существу, между ними находится DLL C++/CLI.

person AaronLS    schedule 02.04.2009