我们如何导出 C# 方法?
我有一个 dll,我想在 Python 语言中使用它的方法和 ctypes 模块。因为我需要使用 ctypes 模块,所以我需要导出 C# 方法以便它们在 Python 中可见。
那么,如何导出 C# 方法(就像在 C++ 中所做的那样)?
我们如何导出 C# 方法?
我有一个 dll,我想在 Python 语言中使用它的方法和 ctypes 模块。因为我需要使用 ctypes 模块,所以我需要导出 C# 方法以便它们在 Python 中可见。
那么,如何导出 C# 方法(就像在 C++ 中所做的那样)?
与普遍的看法相反,这是可能的。
见这里。
使用普通的 Python 实现(“CPython”),你不能,至少不能直接。
您可以使用C++/CLI围绕我们的 C# 方法编写本机 C 包装器,并从 Python 调用这些包装器。
或者,您可以尝试IronPython。这使您可以使用任何 .Net 语言(包括 C#)运行 Python 代码和调用代码。
(这可能不再相关,因为 SLaks 发现了那个巧妙的链接,但我会留下一个经过编辑的版本以供参考......)
将 .NET/C# 对象公开给非托管代码(如 Python)的“正常”方式是为 C# DLL(.NET 程序集)创建一个可调用 COM 的包装器,并使用 Python 的 COM/OLE 支持来调用它。要创建 COM 可调用包装器,请使用tlbexp
和/或regasm
命令行实用程序。
然而,显然,这并没有提供 SLaks 的链接所提供的 C/DLL 风格的 API。
那是不可能的。如果需要 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)] 代码是另一种可能性。