diff --git a/src/Microsoft.DiaSymReader/Microsoft.DiaSymReader.csproj b/src/Microsoft.DiaSymReader/Microsoft.DiaSymReader.csproj
index 33979b6d52..f36bfd699f 100644
--- a/src/Microsoft.DiaSymReader/Microsoft.DiaSymReader.csproj
+++ b/src/Microsoft.DiaSymReader/Microsoft.DiaSymReader.csproj
@@ -8,6 +8,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