如何在Python中加载C# dll?
我该怎么在Python中加载一个C#的DLL文件呢?
我需要在C#文件里加一些额外的代码吗?(就像在C++文件里需要用到的export那样)
我不想用IronPython。我想直接把一个模块导入到Python里!
5 个回答
如果你不想使用像 Python .NET 或 IronPython 这样的解决方案,你可以自己做一个 C++/CLI 的包装器,然后用 Python 的 ctypes 来加载它。举个例子:
这个 C++/CLI 库叫做 CallCSharp:
extern "C" {
__declspec(dllexport) void foo()
{
// here you could use managed and unmanaged code
Console.WriteLine("Hello, C# world...");
}
这是一个 Python 脚本:
from ctypes import cdll
lib = cdll.LoadLibrary("./CallCSharp.dll")
lib.foo()
关于使用 ctypes 的更多例子可以在 这里找到。
我强烈推荐你阅读这个博客: http://pragmateek.com/if-your-plumbing-doesnt-work-youre-just-not-using-enough-pipes/#more-1745
这个博客还解决了一个问题,就是当 C++/CLI 的包装器调用另一个程序集里的代码时会出现的问题(如果发生这种情况,你的 Python 脚本可能会显示类似 WindowsError: [Error -532462766] Windows Error 0xE0434352 的错误)。
现在,Python for.NET这个包和Python的实现版本IronPython的工作方式是一样的。
下面是一个关于C# DLL MyDll.dll
的示例:
import clr
clr.AddReference('MyDll')
from MyNamespace import MyClass
my_instance = MyClass()
想了解更多细节,可以查看这篇文章。
这是为了回答你问题的第二部分。
试着让这个DLL变得可以被COM识别。
可以使用下面的代码:
[ComVisible(true)]
好的,IronPython是Python语言在.NET上的一个实现。
这个技术会在.NET 4.0发布时使用DLR(动态语言运行时),这样IronPython会变得更加灵活(这算不算一个词?)。
如果你是Python高手,使用IronPython时会感觉更自在。
所以你可以选择IronPython,如果这样做的话,就可以跳过让它COM可见的步骤,因为C#和IronPython都是在.NET平台下的。