IronPython cdll无法加载库。如果不使用IronPython,则可以使用

时间:2018-07-09 17:51:52

标签: python dll ironpython

我有一个加载'c'dll的python脚本,在使用python 2.7(Anaconda)时运行良好。这是我用来测试错误的测试脚本:

import os
import ctypes
ctypes.cdll.LoadLibrary(os.path.abspath("a_c_library.dll"))

当与python 2.7一起使用时,这可以正常工作: python test.py。没有错误出现,以后我也可以使用该库。

如果我在C#程序中使用IronPython,甚至仅使用类似这样的命令行: "C:\Program Files\IronPython 2.7\ipy.exe" test.py或ipy32.exe,出现以下错误:

Traceback (most recent call last):
  File "test.py", line 3, in <module>
  File "C:\Program Files\IronPython 2.7\Lib\ctypes\__init__.py", line 445, in LoadLibrary
  File "C:\Program Files\IronPython 2.7\Lib\ctypes\__init__.py", line 366, in __init__
OSError: IronPython.Runtime.Exceptions.OSException: cannot load library **THE ABSOLUTE PATH TO MY DLL WHICH IS CORRECT**

为什么使用IronPython时不能加载库?我在Windows 10上。再次,我可以在使用普通python时使用该库,但是IronPython使用相同的代码给我一个错误。

感谢您的时间!

编辑:我试图直接使用该代码从C#加载相同的dll:

[DllImport("a_c_library.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "AFunction")]
static extern IntPtr Unmanged_AFunction();

然后调用未管理的函数,我得到以下错误:System.BadImageFormatException: 'An attempt was made to load a program with an incorrect format.尝试使用x86和x64构建。 x64会显示以下错误:System.DllNotFoundException: 'Unable to load DLL 'a_c_library.dll': The specified module could not be found.,即使将dll复制到与x64 exe相同的位置。

1 个答案:

答案 0 :(得分:0)

如果您不能从C#加载该库,那么很难想象IronPython会有什么不同。除了封装相同的.NET API外,它什么也没做。

如果您查看the sourceLoadLibrary的作用是:

IntPtr res = NativeFunctions.LoadDLL(library, mode);

...,如果失败,您得到的错误信息就会更少:

throw PythonOps.OSError("cannot load library {0}", library);

关于NativeFunctions.LoadDLL,这只是包装代码的一部分,用于决定是从dlopen中调用libdl.so(在macOS和Linux上)还是调用{{3} }(否则)。

因此,如果调用本地Windows函数LoadLibrary在C#中不起作用,则使用ctypes会以完全相同的方式失败,但是会返回一条不太有用的错误消息:告诉您(如评论中所述)System.BadImageFormatException: 'An attempt was made to load a program with an incorrect format',它只是告诉您cannot load library