diff --git a/src/Microsoft.DiaSymReader/Microsoft.DiaSymReader.csproj b/src/Microsoft.DiaSymReader/Microsoft.DiaSymReader.csproj index b920f9ca8f..c55aadf4e9 100644 --- a/src/Microsoft.DiaSymReader/Microsoft.DiaSymReader.csproj +++ b/src/Microsoft.DiaSymReader/Microsoft.DiaSymReader.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;$(NetCurrent) true @@ -7,6 +7,7 @@ Microsoft DiaSymReader interop interfaces and utilities. Microsoft DiaSymReader interop interfaces and utilities DiaSymReader ISymUnmanagedReader PDB COM interop debugging + true diff --git a/src/Microsoft.DiaSymReader/Reader/SymUnmanagedReaderFactory.cs b/src/Microsoft.DiaSymReader/Reader/SymUnmanagedReaderFactory.cs index 8bad70334f..fda72897cc 100644 --- a/src/Microsoft.DiaSymReader/Reader/SymUnmanagedReaderFactory.cs +++ b/src/Microsoft.DiaSymReader/Reader/SymUnmanagedReaderFactory.cs @@ -8,6 +8,9 @@ namespace Microsoft.DiaSymReader { +#if NET + [System.Runtime.Versioning.SupportedOSPlatform("windows")] +#endif public static class SymUnmanagedReaderFactory { /// diff --git a/src/Microsoft.DiaSymReader/SymUnmanagedFactory.cs b/src/Microsoft.DiaSymReader/SymUnmanagedFactory.cs index d404e7b576..29c1669764 100644 --- a/src/Microsoft.DiaSymReader/SymUnmanagedFactory.cs +++ b/src/Microsoft.DiaSymReader/SymUnmanagedFactory.cs @@ -1,4 +1,4 @@ -// Licensed to the .NET Foundation under one or more agreements. +// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. @@ -21,6 +21,9 @@ namespace Microsoft.DiaSymReader { +#if NET + [System.Runtime.Versioning.SupportedOSPlatform("windows")] +#endif internal static partial class SymUnmanagedFactory { private const string AlternativeLoadPathEnvironmentVariableName = "MICROSOFT_DIASYMREADER_NATIVE_ALT_LOAD_PATH"; @@ -40,7 +43,11 @@ internal static partial class SymUnmanagedFactory // CorSymReader_SxS from corsym.idl private const string SymReaderClsid = "0A3976C5-4529-4ef8-B0B0-42EED37082CD"; +#if NET + private const string IUnknownIid = "00000000-0000-0000-C000-000000000046"; +#else private static Type s_lazySymReaderComType, s_lazySymWriterComType; +#endif internal static string DiaSymReaderModuleName => RuntimeInformation.ProcessArchitecture switch @@ -99,6 +106,11 @@ internal static string DiaSymReaderModuleName private delegate void NativeFactory(ref Guid id, [MarshalAs(UnmanagedType.IUnknown)] out object instance); #endif +#if NET + [LibraryImport("Ole32")] + private static unsafe partial int CoCreateInstance(in Guid rclsid, void* pUnkOuter, int dwClsContext, in Guid riid, out void* ppObj); +#endif + // internal for testing internal static string GetEnvironmentVariable(string name) { @@ -140,7 +152,7 @@ private static unsafe object TryLoadFromAlternativePath(Guid clsid, bool createR var creator = Marshal.GetDelegateForFunctionPointer(createAddress); creator(ref clsid, out instance); #else - var creator = (delegate*unmanaged)createAddress; + var creator = (delegate* unmanaged)createAddress; IntPtr rawInstance = default; creator(&clsid, &rawInstance); instance = createReader @@ -159,22 +171,27 @@ private static unsafe object TryLoadFromAlternativePath(Guid clsid, bool createR return instance; } - private static Type GetComTypeType(ref Type lazyType, Guid clsid) +#if NET + private static unsafe object ActivateClass(Guid clsid) { - if (lazyType == null) + int hr = CoCreateInstance(in clsid, null, 1, new Guid(IUnknownIid), out void* rawInstance); + if (hr < 0) { - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - lazyType = Marshal.GetTypeFromCLSID(clsid); - } - else - { - throw new NotSupportedException("COM lookup is not supported"); - } + Marshal.ThrowExceptionForHR(hr); } - - return lazyType; + return ComInterfaceMarshaller.ConvertToManaged(rawInstance); } +#else + private static object ActivateClass(ref Type lazyType, Guid clsid) + { + if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + throw new PlatformNotSupportedException("COM lookup is not supported"); + } + lazyType ??= Marshal.GetTypeFromCLSID(clsid); + return Activator.CreateInstance(lazyType); + } +#endif internal static unsafe object CreateObject(bool createReader, bool useAlternativeLoadPath, bool useComRegistry, out string moduleName, out Exception loadException) { @@ -265,11 +282,11 @@ internal static unsafe object CreateObject(bool createReader, bool useAlternativ // Try to find a registered CLR implementation try { - var comType = createReader ? - GetComTypeType(ref s_lazySymReaderComType, clsid) : - GetComTypeType(ref s_lazySymWriterComType, clsid); - - instance = Activator.CreateInstance(comType); +#if NET + instance = ActivateClass(clsid); +#else + instance = ActivateClass(ref createReader ? ref s_lazySymReaderComType : ref s_lazySymWriterComType, clsid); +#endif moduleName = LegacyDiaSymReaderModuleName; } catch (Exception e) @@ -281,6 +298,5 @@ internal static unsafe object CreateObject(bool createReader, bool useAlternativ return instance; } - } } \ No newline at end of file diff --git a/src/Microsoft.DiaSymReader/Writer/SymUnmanagedWriterFactory.cs b/src/Microsoft.DiaSymReader/Writer/SymUnmanagedWriterFactory.cs index 9b9277b426..b69b3b987b 100644 --- a/src/Microsoft.DiaSymReader/Writer/SymUnmanagedWriterFactory.cs +++ b/src/Microsoft.DiaSymReader/Writer/SymUnmanagedWriterFactory.cs @@ -7,6 +7,9 @@ namespace Microsoft.DiaSymReader { +#if NET + [System.Runtime.Versioning.SupportedOSPlatform("windows")] +#endif public static class SymUnmanagedWriterFactory { ///