fsprojects / FSharp.Compiler.CodeDom

An F# CodeDOM implementation (based on the old F# Power Pack)
http://fsprojects.github.io/FSharp.Compiler.CodeDom/
The Unlicense
25 stars 14 forks source link

CompileAssemblyFromFile crashes with "The system cannot find the file specified" even though File.Exists reports that the file exists #27

Closed sharma7n closed 4 years ago

sharma7n commented 4 years ago

Description

When I call CompileAssemblyFromFile on my provider instance, the program throws the following error stack trace:

Unhandled Exception: System.ComponentModel.Win32Exception: The system cannot find the file specified
   at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo)
   at FSharp.Compiler.CodeDom.Internal.Compiler.compileFiles(String args, CompilerResults res)
   at FSharp.Compiler.CodeDom.Internal.Compiler.compileAssemblyFromFileBatch(CompilerParameters options, String[] fileNames, CompilerResults results, FSharpFunc`2 sortf)
   at Program.main(String[] argv)

This occurs despite the fact that System.IO.File.Exists returns true when passed in the file path.

Here is the full code:

open System.IO
open System.CodeDom.Compiler
open FSharp.Compiler.CodeDom

[<EntryPoint>]
let main argv =
    let sourceFilePath = Array.get argv 0
    if File.Exists(sourceFilePath) then
        let provider = new FSharpCodeProvider()
        let mutable compilerParameters = CompilerParameters()
        compilerParameters.GenerateInMemory <- true
        provider.CompileAssemblyFromFile(compilerParameters, [| sourceFilePath |])
        |> ignore
    else
        printf "File does not exist"
    0

Here is myfsproj file:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net461</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Compile Include="Program.fs" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="FSharp.Compiler.CodeDom" Version="1.0.0.1" />
  </ItemGroup>

</Project>

Repro steps

  1. Create a new application using: dotnet new console -lang F#.
  2. cd into the application directory.
  3. Paste the above code block into Program.fs.
  4. Paste the above config block into <application>.fsproj.
  5. dotnet build (succeeds).
  6. Create an F# source file in the same directory and save it as foo.fs. I used the following:
namespace Foo

type Bar = { baz : int }
  1. dotnet run foo.fs

Expected behavior

The program executes without throwing an exception.

Actual behavior

The program throws System.ComponentModel.Win32Exception with the above stack trace.

Known workarounds

No known workarounds.

Related information

drvink commented 4 years ago

Sorry I'm so late in replying to this. May I ask how you're using this package with .NET Core? FCS is a better, well-supported option for F#; this package really exists for legacy compatibility at this point...

sharma7n commented 4 years ago

Unfortunately, I'm no longer working at the company where I was trying to do this and no longer have access to the machine I was developing on, so I can't answer your question. I'll just go ahead and close the issue. Thanks!