小编arv*_*ndd的帖子

如何链接到Haskell的C#(即托管)DLL?

我试图从我的Haskell代码构建一个Windows DLL.应该从C#中的托管代码调用此DLL中的函数.并且,从该DLL中的函数调用至少一个函数(在c#代码中定义).

冒着过度解释的风险,这是一个描绘我想要的小图:

+----------------------+           +------------------------+
|   Managed C# code    |           |  Haskell code (in DLL) |
|                      |     (1)   |                        |
|  fn_calling_hs()  -----------------> fn_called_from_cs()  |   
|                      |           |                        |
|                      |           |                        |          
| fn_called_from_hs() <--------------- fn_calling_cs()      |
|                      |     (2)   |                        |
+----------------------+           +------------------------+
Run Code Online (Sandbox Code Playgroud)

我设法使(1)完美地工作,即,DLL中的Haskell函数由C#代码调用,具有正确的结构和数组编组,并且Haskell中函数执行的结果也是正确的.到现在为止还挺好.

问题在于(2),即来自Haskell(在DLL中)调用C#中定义的托管函数的函数.问题在于构建本身 - 我还没有过去实际检查(2)的结果.

由于c#托管代码中的fn_called_from_hs()是在C#中定义的,因此我只在Haskell代码(在DLL中)中使用了函数符号"imported":

foreign import ccall fn_called_from_hs :: IO CString
Run Code Online (Sandbox Code Playgroud)

现在,当我使用堆栈构建我的Haskell项目时,它构建Haskell DLL没有问题,但构建继续也链接"main.exe" - 这显然失败了(显然),因为没有在任何地方定义的函数fn_called_from_hs() Haskell代码(它在c#中定义).

在构建HsDLL.dll之后,有什么办法可以阻止堆栈继续构建main.exe吗?我对HsDLL.dll具有未解析的符号(fn_called_from_hs())没问题,因为在由管理的C#代码加载此DLL期间,运行时链接程序将找到此符号.

到目前为止,我已尝试过这些步骤,但它们都没有帮助:

  1. 从package.yaml中删除了"可执行文件"和"测试"
  2. -no-hs-main在package.yaml中添加了GHC选项:包含HsDLL构建的package.yaml部分如下所示:

    library:   
      source-dirs: 
      - src
      - src/csrc   
      include-dirs: src/csrc   
      ghc-options:
      - -shared
      - …
    Run Code Online (Sandbox Code Playgroud)

haskell haskell-stack haskell-ffi

8
推荐指数
1
解决办法
206
查看次数

标签 统计

haskell ×1

haskell-ffi ×1

haskell-stack ×1