5

f# コードを動的にコンパイルして実行するための基本的なプログラムを作成しようとしています。次のコードを実行しようとしています。

open System 
open System.CodeDom.Compiler 
open Microsoft.FSharp.Compiler.CodeDom 

// Our (very simple) code string consisting of just one function: unit -> string 
let codeString =
"module Synthetic.Code\n    let syntheticFunction() = \"I've been compiled on the      fly!\""
// Assembly path to keep compiled code
let synthAssemblyPath = "synthetic.dll"

let CompileFSharpCode(codeString, synthAssemblyPath) =
    use provider = new FSharpCodeProvider() 
    let options = CompilerParameters([||], synthAssemblyPath) 
    let result = provider.CompileAssemblyFromSource( options, [|codeString|] ) 
    // If we missed anything, let compiler show us what's the problem
    if result.Errors.Count <> 0 then 
        for i = 0 to result.Errors.Count - 1 do
            printfn "%A" (result.Errors.Item(i).ErrorText)
    result.Errors.Count = 0

if CompileFSharpCode(codeString, synthAssemblyPath) then
    let synthAssembly = Reflection.Assembly.LoadFrom(synthAssemblyPath) 
    let synthMethod  =      synthAssembly.GetType("Synthetic.Code").GetMethod("syntheticFunction") 
    printfn "Success: %A" (synthMethod.Invoke(null, null))
else
    failwith "Compilation failed"

このサイトから: http://infsharpmajor.wordpress.com/2012/04/01/how-to-dynamically-synthesize-executable-f-code-from-text/

私が抱えている問題は、次の行にあります。

let result = provider.CompileAssemblyFromSource( options, [|codeString|] ) 

例外が発生する場所:The System cannot find the file specified.

必要な参照を含めましたが、Fsharp.compiler.codeDom.dllFsharp.compiler.dllに何が問題なのかわかりません。私は現在CodeDom、codeplex から dll ソース コードを取得してステップ実行しようとしていますが、見落としている問題を誰かが見ることができれば、頭痛の種を大幅に減らすことができます。

お時間をいただきありがとうございます - アルパー

4

1 に答える 1

3

F# PowerPack の CodeDOM 実装の下では、F# コンパイラを使用してコードを生成します。つまり、コンパイラと関連するメタデータを見つける方法が必要です。

最初に、 FSharp.Core.sigdataファイルを bin フォルダー (メタデータ)にコピーする必要がある場合があります。F# コンパイラ (fsc.exe) をパスに追加するか、bin フォルダーにコピーする必要がある場合もあります (fsc.exe は C:\Program Files (x86)\Microsoft SDKs\F#\3.0\Framework\ にあります)。 v4.0)。少なくとも、これは Visual Studio 2012 がインストールされた Windows 8 マシンで機能しました。

于 2013-08-09T07:18:37.373 に答える