dotnet / fsharp

The F# compiler, F# core library, F# language service, and F# tooling integration for Visual Studio
https://dotnet.microsoft.com/languages/fsharp
MIT License
3.83k stars 772 forks source link

FsiEvaluationSession cant find Fsharp.Core when hosted in another process. #11770

Open goswinr opened 3 years ago

goswinr commented 3 years ago

Problem

The constructor of FsiEvaluationSession cant find Fsharp.Corewhen FCS is hosted in another process. I used v40.0 but this problem probably existed since FCS 34.0. see https://github.com/dotnet/fsharp/issues/9064 When FCS is hosted in another app ( Rhino3d in my case) the directory at Directory.GetCurrentDirectory() in fsi.fsprobably does not contain FSharp.Core.dll. A non-descriptive StopProcessingExn is raised.

The useful information about the problem is not in the exception, but only in the FSI error stream:

error FS0078: Unable to find the file 'FSharp.Core.dll' in any of
 C:\Windows\Microsoft.NET\Framework64\v4.0.30319
 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\WPF
 C:\Program Files\Rhino 7\System
 C:\Program Files\Rhino 7\System\

Workaround

The workaround is to set the current directory to the location of FSharp.Core.dll before calling FsiEvaluationSession.Create(...) for example via: Directory.SetCurrentDirectory(Path.GetDirectoryName(Reflection.Assembly.GetAssembly([].GetType()).Location)) It took me one year, two other issues on this repo, and the reading of the now more descriptive FSI error stream (since 40.0) in addition to the exception, to understand what the problem was and find this workaround.

JustinGrote commented 8 months ago

Can this be cheated with an assemblyloadcontext or assemblycontexthandler?

goswinr commented 7 months ago

@JustinGrote Thanks for thinking about this. It seems that not so many people are hosting FSI. Would I have to use the AssemblyLoadContext for hosting FCS and FSI ?