diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs b/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs index 6d3d6b730262fd..6aaffb5f82a219 100644 --- a/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs +++ b/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs @@ -470,7 +470,53 @@ int ISOSDacInterface.GetAssemblyModuleList(ClrDataAddress assembly, uint count, } int ISOSDacInterface.GetAssemblyName(ClrDataAddress assembly, uint count, char* name, uint* pNeeded) - => _legacyImpl is not null ? _legacyImpl.GetAssemblyName(assembly, count, name, pNeeded) : HResults.E_NOTIMPL; + { + int hr = HResults.S_OK; + try + { + if (name is not null) + name[0] = '\0'; + Contracts.ILoader contract = _target.Contracts.Loader; + Contracts.ModuleHandle handle = contract.GetModuleHandleFromAssemblyPtr(assembly.ToTargetPointer(_target)); + string path = contract.GetPath(handle); + + // Return not implemented for empty paths for non-reflection emit assemblies (for example, loaded from memory) + if (string.IsNullOrEmpty(path)) + { + Contracts.ModuleFlags flags = contract.GetFlags(handle); + if (!flags.HasFlag(Contracts.ModuleFlags.ReflectionEmit)) + hr = HResults.E_NOTIMPL; + else + hr = HResults.E_FAIL; + } + + OutputBufferHelpers.CopyStringToBuffer(name, count, pNeeded, path); + } + catch (System.Exception ex) + { + hr = ex.HResult; + } + +#if DEBUG + if (_legacyImpl is not null) + { + char[] fileNameLocal = new char[count]; + uint neededLocal; + int hrLocal; + fixed (char* ptr = fileNameLocal) + { + hrLocal = _legacyImpl.GetAssemblyName(assembly, count, ptr, &neededLocal); + } + Debug.Assert(hrLocal == hr, $"cDAC: {hr:x}, DAC: {hrLocal:x}"); + if (hr == HResults.S_OK) + { + Debug.Assert(pNeeded == null || *pNeeded == neededLocal); + Debug.Assert(name == null || new ReadOnlySpan(fileNameLocal, 0, (int)neededLocal - 1).SequenceEqual(new string(name))); + } + } +#endif + return hr; + } int ISOSDacInterface.GetCCWData(ClrDataAddress ccw, void* data) => _legacyImpl is not null ? _legacyImpl.GetCCWData(ccw, data) : HResults.E_NOTIMPL; int ISOSDacInterface.GetCCWInterfaces(ClrDataAddress ccw, uint count, void* interfaces, uint* pNeeded)