Добрый день, коллеги!
В Haskell-сafe промелькнул анонс мини-библиотечки, которая позволяет из Хаскеля звать .Net через рефлекшен.
Как я понял, технически реализовано через вызовы .Net COM-объекта, который выставляет наружу интерфейс для вызова дотнетовских функций через рефлекшен.
Из примеров:
module MD5 where
import NET
import Data.Word
import Numeric
calcMD5FromString :: String -> IO String
calcMD5FromString str = do
md <- invokeStatic "System.Security.Cryptography.MD5" "Create" ()
fi <- getFieldStatic "System.Text.Encoding" "ASCII" ()
bs <- fi # invoke "GetBytes" str
vec <- md # invoke "ComputeHash" (bs :: Vector Word8)
res <- vec # bytesToString
let resStr = foldr (showHex) "" res
return resStr
bytesToString :: Vector Word8 -> IO [Word8]
bytesToString vec = do
len <- vec # getField "Length" ()
mapM (\ i -> do
x <- vec # invoke "GetValue" (i::Int)
return (x::Word8))
[0..((len::Int)-1)]
суть в функциях invoke, invokeStatic.
Также присутствует утилитка, которая занимается генерацией типов и функций, которые оборачивают вызовы через рефлекшен.
Примерно так:
module NET.System.Uri where
-- ...
data Uri_ a
type Uri a = NET.System.Object.Object (Uri_ a)
get_AbsolutePath :: Uri obj -> IO (String)
get_AbsolutePath = invoke "get_AbsolutePath" ()
http://haskell.forkio.com/dotnet
C Уважением, Andir!
using( RSDN@Home 1.2.0 alpha 4 rev. 1135 ) { /* Работаем */ }