我要设置一个Jupyter Notebook,在其中调用C#DLL。调用单个自包含DLL时,此方法工作正常,但当DLL依赖于另一个C#DLL时,此方法将失败。
使用ctypes和UnmanagedExports来完成对DLL的调用,如下所述:https://stackoverflow.com/a/29854281/11588296
入口DLL的源代码为:
using RGiesecke.DllExport;
using System.Runtime.InteropServices;
namespace SimpleCSharpPython
{
public class Test
{
[DllExport("addDirect", CallingConvention = CallingConvention.Cdecl)]
public static int TestExport1(int left, int right)
{
return left + right;
}
[DllExport("addExtern", CallingConvention = CallingConvention.Cdecl)]
public static int TestExport2(int left, int right)
{
return UnderlyingLib.UnderlyingFunc.TestExternExport(left, right);
}
}
}
基础DLL是:
namespace UnderlyingLib
{
public class UnderlyingFunc
{
public static int TestExternExport(int left, int right)
{
return left + right;
}
}
}
最后,Jupyter笔记本是:
import ctypes
a= ctypes.cdll.LoadLibrary("SimpleCSharpPython.dll")
b= ctypes.cdll.LoadLibrary("UnderlyingLib.dll")
a.addDirect(3, 5)
a.addExtern(3, 4)
第一个调用(a.addDirect(3,5))的输出为8。 第二个调用的输出是以下错误
---------------------------------------------------------------------------
OSError Traceback (most recent call last)
<ipython-input-4-c4df87cc7b32> in <module>
----> 1 a.addExtern(3,4)
OSError: [WinError -532462766] Windows Error 0xe0434352
请注意,笔记本和2个DLL位于同一个文件夹中,当由Visual Studio中的C#可执行文件调用时,这2个DLL运行正常。我尝试了多次构建,路径,ctypes调用,但是没有运气。
任何想法将不胜感激。让我知道是否需要其他信息。
答案 0 :(得分:0)
我不是专家,但是我会尝试的: