我有一个加载'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相同的位置。
答案 0 :(得分:0)
如果您不能从C#加载该库,那么很难想象IronPython会有什么不同。除了封装相同的.NET API外,它什么也没做。
如果您查看the source,LoadLibrary
的作用是:
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
。