c# - 从 C# (Windows) 调用 C 函数 (Linux)

标签 c# c shared-libraries cross-compiling

我在网上找到了很多关于从 C# 调用 C 函数的信息。简单的解决方案是创建一个 .so 文件并使用 C# 中的 DllImport 函数导入它。

using System;

using System.Runtime.InteropServices;

public class Tester 
{
        [DllImport("libtest.so", EntryPoint="cfunction")]

        static extern void cfunction(string message);

        public static void Main(string[] args)
        {

                cfunction("Hello World C# => C++");
        }
}

我的问题是,如果我的 .so 文件是在 Linux 环境中创建的,这有关系吗?我可以只将 .so 文件复制到 Windows 环境并让 C# 使用它而不会出现任何问题吗?我认为这无关紧要,因为 .so 是一个动态库,并且充满了不依赖于创建它的平台的符号。

感谢您的帮助。

最佳答案

does it matter if my .so file was created in a Linux environment ?

是的,这很重要。

共享对象 (so) 文件由链接器生成并包含代码。它们是特定于平台的。即使在两个不同的 CPU 上运行的两个版本的 Linux 也很可能无法使用相同的 .so 文件。

Can I just copy the .so file to a Windows environment and have C# use it without any issues ?

Windows 操作系统不会使用 .so 文件。它需要 .dll 文件,它们是完全不同的格式(并且通常需要完全不同的代码来完成相同的工作)。

I believe it shouldn't matter because .so is a dynamic library and is filled with symbols not dependent on the platform it's created on.

它不仅仅是一个充满符号的文件。它也是将要执行的代码。该代码是特定于平台的。

关于c# - 从 C# (Windows) 调用 C 函数 (Linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34096629/

相关文章:

c# - TFS checkin 政策 - 最佳实践

c# - WPF PasswordBox 中密码的安全优势不可绑定(bind)?

c - LD_INCLUDE_PATH 实际上做了什么吗?

c++ - 这是什么类型的行为?

qt - 如何使用 Qt 编写一个包装另一个库的共享库?

linux - 如何删除共享库中符号周围的字符?

c - 在运行时扫描共享对象包含

c# - 代码在处理文件时约定使用模式

c# - 如何处理以编程方式添加的按钮事件? C#

c++ - 是否可以让 gnu cpp 保留包含宏?