在Jupyter Notebook中加载和调用依赖的C#DLL

时间:2019-06-01 23:50:27

标签: c# python jupyter-notebook

我要设置一个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调用,但是没有运气。

任何想法将不胜感激。让我知道是否需要其他信息。

1 个答案:

答案 0 :(得分:0)

我不是专家,但是我会尝试的:

  • 删除Jupyter中底层dll的加载;
  • 并确保另一个dll是使用指向基础dll的链接编译的,以便当Jupyter使用dll时,它确实需要基础dll,因为只有主dll才需要知道它...