microsoft / MSBuildLocator

An API to locate MSBuild assemblies from an installed Visual Studio location. Use this to ensure that calling the MSBuild API will use the same toolset that a build from Visual Studio or msbuild.exe would.
Other
212 stars 83 forks source link

MSBuildLocator.QueryVisualStudioInstances Fails on Mac and Linux from Version 1.5.3 #210

Closed jamesHargreaves12 closed 10 months ago

jamesHargreaves12 commented 1 year ago

Starting from version 1.5.3, the MSBuildLocator.QueryVisualStudioInstances method fails to execute in Mac and Linux environments. The error message is as follows:

One or more errors occurred. (Unable to load shared library 'hostfxr' or one of its dependencies. In order to help diagnose loading problems, consider setting the DYLD_PRINT_LIBRARIES environment variable: dlopen(libhostfxr, 1): image not found)
  Inner exception: Unable to load shared library 'hostfxr' or one of its dependencies. In order to help diagnose loading problems, consider setting the DYLD_PRINT_LIBRARIES environment variable: dlopen(libhostfxr, 1): image not found
System.AggregateException: One or more errors occurred. (Unable to load shared library 'hostfxr' or one of its dependencies. In order to help diagnose loading problems, consider setting the DYLD_PRINT_LIBRARIES environment variable: dlopen(libhostfxr, 1): image not found)
 ---> System.DllNotFoundException: Unable to load shared library 'hostfxr' or one of its dependencies. In order to help diagnose loading problems, consider setting the DYLD_PRINT_LIBRARIES environment variable: dlopen(libhostfxr, 1): image not found
   at Microsoft.Build.Locator.NativeMethods.hostfxr_resolve_sdk2(String exe_dir, String working_dir, hostfxr_resolve_sdk2_flags_t flags, hostfxr_resolve_sdk2_result_fn result)
   at Microsoft.Build.Locator.DotNetSdkLocationHelper.GetDotNetBasePaths(String workingDirectory)+MoveNext()
   at Microsoft.Build.Locator.DotNetSdkLocationHelper.GetInstances(String workingDirectory)+MoveNext()
   at Microsoft.Build.Locator.MSBuildLocator.GetInstances(VisualStudioInstanceQueryOptions options)+MoveNext()

It's worth noting that the QueryInstancesTests.DefaultInstanceTest unit test fails with the same issue on my mac.

The underlying cause of this issue is the DllImport("hostfxr"...) fails. It cannot find the hostfxr library without additional information about its location. There are similar issues previously reported on dotnet previews, such as https://github.com/dotnet/runtime/issues/54965. The dotnet team resolved these issues by:

I am unsure if there is a straightforward way to leverage this existing fix, however, reimplementing the second part isn't difficult and would at least provides users with a workaround by specifying the HOSTFXR_PATH variable. A draft PR with a potential implementation can be found here: https://github.com/microsoft/MSBuildLocator/pull/209. (note, I don't think this a full solution)

YuliiaKovalova commented 11 months ago

Hi @jamesHargreaves12,

Could you provide repro for this issue? I assume it will be fixed in the scope of https://github.com/microsoft/MSBuildLocator/pull/224, but would like to doublecheck.

We apologize for the late response.

YuliiaKovalova commented 10 months ago

The issue is fixed. Pending release.

iketw commented 10 months ago

The issue is fixed. Pending release.

Hi @YuliiaKovalova , is the fix released?

YuliiaKovalova commented 9 months ago

The issue is fixed. Pending release.

Hi @YuliiaKovalova , is the fix released?

Hi @iketw ,

Yes, the fix is the part of https://www.nuget.org/packages/Microsoft.Build.Locator/1.6.1.