我只是花了上个星期的时间来弄清楚如何从C#执行C ++代码作为我日常工作的一部分。 我们花了很长时间才弄明白,但最后的解决办法很简单。 现在我很好奇…从C#调用Haskell有多难? (注意: 从 C#调用Haskell,而不是相反,所以主要的可执行文件是C#)。 如果真的很难,我不会打扰。 但是如果相当容易,我可能不得不去玩一玩。 基本上,我们写了一些C ++代码。 在Windows上它被编译成一个DLL,在Linux上被编译成一个共享对象( *.so )。 然后在C#端,你做了一个DllImport并且写了一些手动的内存pipe理代码,如果你试图通过任何不平凡的东西。 (例如,数组,string等) 我知道GHC应该支持在两个平台上构build共享库,但我不确定技术细节。 什么是导出东西的语法,调用者必须做任何特别的初始化DLL第一? foobar :: FilePath -> IO Int32 :假设存在一个函数foobar :: FilePath -> IO Int32 。 有人可以把一个小草图放在一起,显示: 我需要写出什么样的Haskell声明才能将其暴露给外部世界。 我如何告诉GHC构build一个自包含的DLL / SO文件。 调用者需要做的任何特殊的事情,超出了绑定foobar本身的通常过程。 我并不担心C#端的实际语法, 我想我已经或多或less地困惑了。 PS我简单地看过hs-dotnet ,但这似乎是Windows特定的。 (即,不会与Mono一起工作,所以不能在Linux上工作。)
我目前正在用C ++编写一个应用程序,发现它的一些function会更好的写在Haskell中。 我看过从C代码调用Haskell的说明,但是可以用C ++做同样的事情吗? 编辑:澄清,我正在寻找的是一种方法来编译Haskell代码到外部库,g ++可以链接从C ++的对象代码。 更新:我已经为其他人感兴趣的(下面我不会忘记)举出一个工作的例子。
我一直在努力在Haskell中编写Windows服务应用程序。 背景 服务应用程序由Windows服务控制pipe理器执行。 启动后,它会阻止对CallService提供的StartServiceCtrlDispatcher的调用,作为服务的主要function 。 该服务的主要function是应该注册第二个callback来处理传入的命令,如开始,停止,继续等。它通过调用RegisterServiceCtrlHandler 。 问题 我可以写一个程序,它将注册一个服务主要function。 然后,我可以将该程序安装为Windows服务,然后从服务pipe理控制台启动它。 该服务能够启动,报告自己正在运行,然后等待传入的请求。 问题是,我无法让我的服务处理函数被调用。 查询服务状态显示它正在运行,但只要我发送一个“停止”命令窗口popup消息说: Windows could not stop the Test service on Local Computer. Error 1061: The service cannot accept control messages at this time. 根据MSDN文档 ,StartServiceCtrlDispatcher函数将阻塞,直到所有服务报告它们停止。 在调用服务主函数之后,调度程序线程应该等待,直到服务控制pipe理器发送一个命令,此时处理函数应该由该线程调用。 细节 接下来是我正在尝试做的一个非常简化的版本,但它演示了我的处理函数没有被调用的问题。 首先,一些名字和import: module Main where import Control.Applicative import Foreign import System.Win32 wIN32_OWN_PROCESS :: DWORD wIN32_OWN_PROCESS = 0x00000010 […]
在Python中,在什么情况下SWIG比ctypes更好的select共享库中的入口点? 假设您还没有SWIG接口文件。 这两个性能指标是什么?
我对Haskell的FFI和GHC的交互模式有一个问题。 考虑FFISo.hs : {-# LANGUAGE OverloadedStrings #-} module Main where import qualified Data.ByteString.Char8 as B import FFIFun.Foo main :: IO () main = do B.putStrLn "main" callMeFromC callMeFromHaskell return () cc : #include <stdio.h> void callMeFromC(void); void callMeFromHaskell(void) { printf("callMeFromHaskell\n"); callMeFromC(); } FFIFun/Foo.hs : {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ForeignFunctionInterface #-} module FFIFun.Foo where […]
哦,我的话我是一个傻瓜。 调用该函数时,我简单地省略了第二个和第三个参数。 像一个傻瓜。 因为这就是我。 原来愚蠢的问题如下: 这似乎是一个非常普通的事情,但是我找不到相关的教程,对于Numpy和ctypes我自己也搞不清楚。 我在文件ctest.c有一个C函数。 #include <stdio.h> void cfun(const void * indatav, int rowcount, int colcount, void * outdatav) { //void cfun(const double * indata, int rowcount, int colcount, double * outdata) { const double * indata = (double *) indatav; double * outdata = (double *) outdatav; int i; puts("Here we go!"); […]