File: Commands\Fsi\FsiForwardingApp.cs
Web Access
Project: ..\..\..\src\Cli\dotnet\dotnet.csproj (dotnet)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
#nullable disable
 
using Microsoft.DotNet.Cli.Utils;
 
namespace Microsoft.DotNet.Cli.Commands.Fsi;
 
public class FsiForwardingApp(string[] arguments) : ForwardingApp(GetFsiAppPath(), processArguments(arguments))
{
    private const string FsiDllName = @"FSharp/fsi.dll";
    private const string FsiExeName = @"FSharp/fsi.exe";
 
    static string[] processArguments(string[] args)
    {
        var lang = UILanguageOverride.GetOverriddenUILanguage();
        if (lang == null)
        {
            return args;
        }
        else
        {
            return [.. args, $"--preferreduilang:{lang.Name}"];
        }
    }
 
    private static bool exists(string path)
    {
        try
        {
            return File.Exists(path);
        }
        catch
        {
            return false;
        }
 
    }
 
    /*
     * FSharp switched from compiling fsi.exe to fsi.dll which will allow us to ship an AppHost version of fsi.exe
     * The signal that fsi.exe is an apphost fs.exe is the presence of fsi.dll
     *
     * So here we look for fsi.dll, if it's found then we will return the path to it, otherwise we return fsi.exe
     * the reason for using this bridging mechanism is to simplify the coordination between F#/VS and the dotnet sdk
    */
    private static string GetFsiAppPath()
    {
        var dllPath = Path.Combine(AppContext.BaseDirectory, FsiDllName);
        if (exists(dllPath))
        {
            return dllPath;
        }
        else
        {
            return Path.Combine(AppContext.BaseDirectory, FsiExeName);
        }
    }
}