【问题标题】:How to export C# methods?如何导出 C# 方法?
【发布时间】:2010-01-17 18:49:24
【问题描述】:

我们如何导出 C# 方法?

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

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

【问题讨论】:

  • python.net 允许使用 Python C-API 和 .NET Pinvoke 和非托管导出在 Python 和 .NET 之间进行双向互操作,如下所述。所以所有的硬文都是为你写的! pythonnet.github.io

标签: c# python methods export python.net


【解决方案1】:

与流行的看法相反,这可能的。
here

【讨论】:

  • 我使用 dllexp.exe 从模板创建的 C# dll 中查看导出的方法,但没有出现该方法。有没有办法让 C# dll 方法在外部可见在 dllexp.exe 之类的程序中?
【解决方案2】:

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

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

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

【讨论】:

  • 我想使用 Python 本身,而不是像 IronPython 这样的额外实现。
【解决方案3】:

这是不可能的。如果需要 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)] 代码是另一种可能性。

【讨论】:

  • 其实是可以的。看我的回答。
  • 嗯,文章和可下载的源代码都没有解释它是如何工作的。我将等待 OP 的确认。
  • 我必须构建一个包装器 c++ dll(c# dll)才能正确使用 ctypes 模块!
  • 我们有了它。
  • @HansPassant 您似乎在 SO 上的所有反向 pinvoke 线程中淡化了非托管导出。但是 C++/CLI 有“可下载的源代码”吗?上一次将 C++ 功能添加到 C++/CLI 是什么时候? UE 获得 MIT 许可,ILSPY 非常擅长为其提供 C# 代码。
【解决方案4】:

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

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

然而,很明显,这并不像 SLaks 的链接那样提供 C/DLL 风格的 API。

【讨论】:

  • 其实是可以的。看我的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多