2

像很多地方一样,我的工作场所有遗留代码以及更现代的应用程序。例如,我们有一个仍然使用 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# 中使用它吗?

4

3 回答 3

2

如果 DLL 是有效的 DLL,并且导出的函数使用众所周知的调用约定,那么只要您在 .NET 中正确获取方法签名,即:正确的参数类型和返回类型,应该没有问题。CLR 不(也不能)关心库是用什么语言编写的。

至于 Linux 共享库,如果您有库的源代码,应该可以使用 Cygwin 或 MiniGW 为 Windows 编译它们。

于 2009-04-02T03:04:58.040 回答
1

我不了解 Linux 中的 Fortan77 或 .so 库,但我知道您可以将 PInvoike 与 C 库一起用于方法调用。此外,您可能希望查看unsafeC# 中用于共享内存应用程序的关键字。它允许您退出内存管理,这可能是您需要的。命名管道和 TCP 套接字可以从 System.Net 命名空间完成。

基本上你说的都可以做到。我不知道实现它的难易程度,但您应该能够从您的 C# 应用程序访问所有这些本机应用程序。

于 2009-04-02T02:44:05.110 回答
1

您还可以创建一个 C++/CLI DLL(编译时的 /CLR 选项),这将允许您编写托管和非托管代码。这使您可以在本机 C++ 中执行几乎所有可以执行的操作,并且还可以与 .NET 组件进行交互。我正在做这样的事情,通过让 C++/CLI dll 基本上位于它们之间,来桥接旧的 C 应用程序和 C# DLL。

于 2009-04-02T03:09:55.063 回答