如何导出C#方法?

15 投票
3 回答
9331 浏览
提问于 2025-04-15 18:07

我们怎么能把C#的方法导出呢?

我有一个dll文件,我想在Python语言中使用它的方法,得用到ctypes这个模块。因为我需要用ctypes模块,所以我得把C#的方法导出来,这样它们才能在Python中被看到。

那么,我该怎么把C#的方法导出呢(就像在C++中那样)?

3 个回答

1

在普通的Python实现(也就是“CPython”)中,你不能直接做到这一点。

你可以用C++/CLI写一些C的包装代码,把我们的C#方法包起来,然后从Python中调用这些包装代码。

或者,你可以试试IronPython。这个工具可以让你运行Python代码,并且可以调用任何.Net语言的代码,包括C#。

1

这是不可能的。如果你需要DLL导出,就必须使用C++/CLI语言。例如:

public ref class Class1 {
public:
  static int add(int a, int b) {
      return a + b;
  }
};

extern "C" __declspec(dllexport) 
int add(int a, int b) {
  return Class1::add(a, b);
}

这个类也可以用C#来写。C++/CLI编译器会生成一个特殊的代码片段,用于导出,这样可以确保CLR(公共语言运行时)被加载,并且执行模式切换到托管模式。不过,这个过程并不是特别快。

在C#中编写[ComVisible(true)]代码也是一种选择。

1

把.NET/C#对象暴露给不受管理的代码(比如Python)的“正常”方式是为C#的DLL(.NET程序集)创建一个可以被COM调用的包装器,然后通过Python的COM/OLE支持来调用它。要创建这个COM可调用的包装器,可以使用tlbexp和/或regasm这两个命令行工具。

不过,很明显,这种方法并不能提供一个像C/DLL那样的API。

撰写回答