標籤:des style color os io 檔案 for 問題
初步解決《powershell 的版本所引起的載入 FSharp 編譯器問題》
首先,我們定義一個函數 Compiler-FSharp,有兩個參數,一個是 F# 原始碼,當然是必須的;另一個是必須的引用,這是可選的。
然後,調用這個函數。
Function Compiler-FSharp ([string]$fSharpCode,[Array]$References)
{
# 判斷 Powershell 的版本
$is32=$PSHOME.Contains("SysWOW64")
$isAMD64= ($env:PROCESSOR_ARCHITECTURE).Contains("AMD64")
# 增加 Path 等
if ($isAMD64)
{
$env:Path=$env:Path+";C:\ProgramFiles (x86)\Microsoft SDKs\F#\4.0\Framework\v4.0"
Add-Type-Path"C:\ProgramFiles (x86)\ReferenceAssemblies\Microsoft\FSharp\.NETFramework\v4.0\4.3.0.0\FSharp.Core.dll"
if($is32)
{
$ra= "C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll"
}
else
{
$ra= "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscorlib.dll"
}
}
else
{
if($is32)
{
$env:Path= $env:Path+ ";C:\ProgramFiles (x86)\Microsoft SDKs\F#\4.0\Framework\v4.0"
Add-Type-Path"C:\ProgramFiles (x86)\ReferenceAssemblies\Microsoft\FSharp\.NETFramework\v4.0\4.3.0.0\FSharp.Core.dll"
}
else
{
$env:Path= $env:Path+ ";C:\ProgramFiles\Microsoft SDKs\F#\4.0\Framework\v4.0"
Add-Type-Path"C:\ProgramFiles\ReferenceAssemblies\Microsoft\FSharp\.NETFramework\v4.0\4.3.0.0\FSharp.Core.dll"
}
$ra="C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll"
}
if ($references.Count-ge 1)
{
$ra.AddRange($References)
$references| % {Add-Type -Path $_ -ErrorAction SilentlyContinue}
}
# 載入 FSharp.Compiler.CodeDom.dll
Add-Type-PathC:\FSharpPowerPack-4.0.0.0\bin\FSharp.Compiler.CodeDom.dll
$provider=New-ObjectMicrosoft.FSharp.Compiler.CodeDom.FSharpCodeProvider
$fSharpCode=Get-Content"C:\Users\tmx\Desktop\loop.fs"|Out-String
$fSharpType=Add-Type-TypeDefinition$fSharpCode-CodeDomProvider$provider-ReferencedAssemblies$ra-ErrorActionIgnore-PassThru|where { $_.IsPublic }
$fSharpType
<#
-CompilerParameters
$cp = New-ObjectSystem.CodeDom.Compiler.CompilerParameters
$cp.CompilerOptions= "--platform:x86"
#>
}
調用 Compiler-FSharp。
Compiler-FSharp $fSharpCode
後面就可以調用在 F# 原始碼中定義的函數了,比如:
[Test]::HelloWorld
[Test]::Loop(10)
[Test]::factorial(10)
=========================
附:F# 原始碼。
$fSharpCode [email protected]"
module Test
let HelloWorld =
"Hello World!!!!"
printfn "%s" HelloWorld
let rec Loop n =
seq [
if n <= 0 then
()
else
yield n;
yield! Loop (n-1)
] |> Seq.sort
printfn "%A" (Loop 5)
let rec factorial x =
if x = 0 then 1
else x * (factorial (x - 1))
"@
如果,原始碼是儲存在檔案中的,也可以這樣:
$fSharpCode= Get-Content"C:\Scripts\TestCompilerFSharp.fs"|Out-String