ionide / proj-info

Parse and evaluate MsBuild project files
MIT License
64 stars 35 forks source link

Crash on initialisation when included in build with `-p:PublishSingleFile=true` #193

Open varon opened 1 year ago

varon commented 1 year ago

I have encountered a hard crash inside your library due to use of reflection which is not available in a single file publish mode.

This should be very simple to solve.

System.TypeInitializationException: The type initializer for '<StartupCode$Ionide-ProjInfo-ProjectSystem>.$Environment' threw an exception.
 ---> System.ArgumentNullException: Value cannot be null. (Parameter 'path1')
   at System.IO.Path.Combine(String path1, String path2)
   at <StartupCode$Ionide-ProjInfo-ProjectSystem>.$Environment..cctor() in /_//src/Ionide.ProjInfo.ProjectSystem/Environment.fs:line 148
   --- End of inner exception stack trace ---
   at Ionide.ProjInfo.ProjectSystem.Environment.get_dotnetSDKRoot()
   at FsAutoComplete.LspHelpers.FSharpConfig.get_Default() in src/FsAutoComplete/LspHelpers.fs:line 801
   at FsAutoComplete.Lsp.FSharpLspServer..ctor(State state, FSharpLspClient lspClient, ISourceTextFactory sourceTextFactory) in src/FsAutoComplete/LspServers/FsAutoComplete.Lsp.fs:line 52
   at FsAutoComplete.Lsp.FSharpLspServerModule.startCore@3009-56.Invoke(FSharpLspClient lspClient) in src/FsAutoComplete/LspServers/FsAutoComplete.Lsp.fs:line 3012

The precise issue occurs on line: https://github.com/ionide/proj-info/blob/67cc98f0a719f8e3126100a2bd109ace85548ad3/src/Ionide.ProjInfo.ProjectSystem/Environment.fs#L146

Alternative approaches to achieve the same thing are available here: https://stackoverflow.com/questions/58428375/cannot-get-original-executable-path-for-net-core-3-0-single-file-ppublishsin

And the full documentation explaining the compatibility is here: https://learn.microsoft.com/en-us/dotnet/core/deploying/single-file/overview?tabs=cli#api-incompatibility

baronfel commented 1 year ago

Would you be interested in submitting a PR to resolve this?

varon commented 1 year ago

Unfortunately not at this time.

If I was working directly with ionide/proj info, sure - I only opened this up because I ran into a downstream issue with the F# LSP FsAutoComplete which I'm experimenting with, so don't have the code checked out and/or building on my side.

I'd also suggest that a change like this has the potential to be quite fiddly. There's probably various deployment scenarios to look out for, and someone experienced should definitely check this being fixed.

Sorry I can't be of direct help in solving this today.