15

我们如何导出 C# 方法?

我有一个 dll,我想在 Python 语言中使用它的方法和 ctypes 模块。因为我需要使用 ctypes 模块,所以我需要导出 C# 方法以便它们在 Python 中可见。

那么,如何导出 C# 方法(就像在 C++ 中所做的那样)?

4

4 回答 4

22

与普遍的看法相反,这可能的。
这里

于 2010-01-17T19:01:36.500 回答
1

使用普通的 Python 实现(“CPython”),你不能,至少不能直接。

您可以使用C++/CLI围绕我们的 C# 方法编写本机 C 包装器,并从 Python 调用这些包装器。

或者,您可以尝试IronPython。这使您可以使用任何 .Net 语言(包括 C#)运行 Python 代码和调用代码。

于 2010-01-17T18:58:04.403 回答
1

(这可能不再相关,因为 SLaks 发现了那个巧妙的链接,但我会留下一个经过编辑的版本以供参考......)

将 .NET/C# 对象公开给非托管代码(如 Python)的“正常”方式是为 C# DLL(.NET 程序集)创建一个可调用 COM 的包装器,并使用 Python 的 COM/OLE 支持来调用它。要创建 COM 可调用包装器,请使用tlbexp和/或regasm命令行实用程序。

然而,显然,这并没有提供 SLaks 的链接所提供的 C/DLL 风格的 API。

于 2010-01-17T18:59:48.063 回答
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 编译器为导出发出一个特殊的 thunk,以确保 CLR 已加载并且执行切换到托管模式。这不是很快。

用 C# 编写 [ComVisible(true)] 代码是另一种可能性。

于 2010-01-17T19:03:26.153 回答