gpt4 book ai didi

F#如何将代码引用编译为程序集

转载 作者:行者123 更新时间:2023-12-04 01:01:05 25 4
gpt4 key购买 nike

我想知道是否有办法将代码引用编译成程序集?

我了解可以调用CompileUntyped()Compile()Exp<_>对象,例如:

let x = <@ 1 * 2 @>
let com = x.Compile()

但是,我怎样才能坚持 com磁盘作为一个组件?

谢谢。

最佳答案

您可以使用模式匹配评估 F# 代码报价:

open Microsoft.FSharp.Quotations.Patterns

let rec eval = function
| Value(v,t) -> v
| Call(None,mi,args) -> mi.Invoke(null, evalAll args)
| arg -> raise <| System.NotSupportedException(arg.ToString())
and evalAll args = [|for arg in args -> eval arg|]

let x = eval <@ 1 * 3 @>

F# PowerPack , Unquote , Foq OSS项目或者这个 snippet以获得更完整的实现。

要编译 F# 代码报价,您可以 define a dynamic method使用 Reflection.Emit :
open System.Reflection.Emit

let rec generate (il:ILGenerator) = function
| Value(v,t) when t = typeof<int> ->
il.Emit(OpCodes.Ldc_I4, v :?> int)
| Call(None,mi,args) ->
generateAll il args
il.EmitCall(OpCodes.Call, mi, null)
| arg -> raise <| System.NotSupportedException(arg.ToString())
and generateAll il args = for arg in args do generate il arg

type Marker = interface end

let compile quotation =
let f = DynamicMethod("f", typeof<int>, [||], typeof<Marker>.Module)
let il = f.GetILGenerator()
quotation |> generate il
il.Emit(OpCodes.Ret)
fun () -> f.Invoke(null,[||]) :?> int

let f = compile <@ 1 + 3 @>
let x = f ()

要再次编译为程序集,请使用 Reflection.Emit 使用方法生成类型:
open System
open System.Reflection

let createAssembly quotation =
let name = "GeneratedAssembly"
let domain = AppDomain.CurrentDomain
let assembly = domain.DefineDynamicAssembly(AssemblyName(name), AssemblyBuilderAccess.RunAndSave)
let dm = assembly.DefineDynamicModule(name+".dll")
let t = dm.DefineType("Type", TypeAttributes.Public ||| TypeAttributes.Class)
let mb = t.DefineMethod("f", MethodAttributes.Public, typeof<int>, [||])
let il = mb.GetILGenerator()
quotation |> generate il
il.Emit(OpCodes.Ret)
assembly.Save("GeneratedAssembly.dll")

createAssembly <@ 1 + 1 @>

Fil项目(F# 到 IL)以获得更完整的实现。

关于F#如何将代码引用编译为程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6967178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com