初步解決《powershell 的版本所引起的載入 FSharp 編譯器問題》

來源:互聯網
上載者:User

標籤: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


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.