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

Как и во многих других местах, мое рабочее место содержит устаревший код и более современные приложения. Например, у нас есть серверное приложение, которое все еще использует компилятор 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 #?

Ответы [ 3 ]

2 голосов
/ 02 апреля 2009

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

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

1 голос
/ 02 апреля 2009

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

1 голос
/ 02 апреля 2009

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

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

...