我试图从我的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期间,运行时链接程序将找到此符号.
到目前为止,我已尝试过这些步骤,但它们都没有帮助:
-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)