Cross-platform C# solution
Use PEReader.HasMetadata
:
using System;
using System.Linq;
using System.IO;
using System.Reflection.PortableExecutable;
public class Program
{
public static void Main()
{
Console.WriteLine(Environment.OSVersion);
var currentAssemblyIsManaged = IsManaged(typeof(Program).Assembly.Location) ?? false;
Console.WriteLine($"The currently executing assembly is {(currentAssemblyIsManaged ? "" : "not ")}managed");
Console.WriteLine("Here are some unmanaged assemblies:");
var unmanagedAssemblies = ((string)AppContext.GetData("TRUSTED_PLATFORM_ASSEMBLIES"))
.Split(OperatingSystem.IsWindows() ? ';' : ':')
.Select(path => Path.GetDirectoryName(path))
.Distinct()
.SelectMany(directory => Directory.GetFiles(directory))
.Where(file => IsManaged(file) == false);
foreach (var path in unmanagedAssemblies)
{
Console.Write('\t');
Console.WriteLine(path);
}
}
static bool? IsManaged(string path)
{
try
{
using var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
using var peReader = new PEReader(stream);
return peReader.HasMetadata;
}
catch
{
// Probably not an assembly, but maybe the file is merely inaccessible at the moment?
return null;
}
}
}
.NET Fiddle
Output from .NET Fiddle:
Unix 5.15.0.1024
The currently executing assembly is managed
Here are some unmanaged assemblies:
/usr/share/dotnet/shared/Microsoft.NETCore.App/7.0.5/libmscordbi.so
/usr/share/dotnet/shared/Microsoft.NETCore.App/7.0.5/libcoreclrtraceptprovider.so
/usr/share/dotnet/shared/Microsoft.NETCore.App/7.0.5/libcoreclr.so
/usr/share/dotnet/shared/Microsoft.NETCore.App/7.0.5/libmscordaccore.so
/usr/share/dotnet/shared/Microsoft.NETCore.App/7.0.5/libSystem.IO.Compression.Native.so
/usr/share/dotnet/shared/Microsoft.NETCore.App/7.0.5/libclrgc.so
/usr/share/dotnet/shared/Microsoft.NETCore.App/7.0.5/libclrjit.so
Output on a Windows machine:
Microsoft Windows NT 10.0.22621.0
The currently executing assembly is managed
Here are some unmanaged assemblies:
C:\Users\____\bin\Debug\net7.0\ConsoleApp22.exe
C:\Program Files\dotnet\shared\Microsoft.NETCore.App\7.0.5\clretwrc.dll
C:\Program Files\dotnet\shared\Microsoft.NETCore.App\7.0.5\clrgc.dll
C:\Program Files\dotnet\shared\Microsoft.NETCore.App\7.0.5\clrjit.dll
C:\Program Files\dotnet\shared\Microsoft.NETCore.App\7.0.5\coreclr.dll
C:\Program Files\dotnet\shared\Microsoft.NETCore.App\7.0.5\createdump.exe
C:\Program Files\dotnet\shared\Microsoft.NETCore.App\7.0.5\hostpolicy.dll
C:\Program Files\dotnet\shared\Microsoft.NETCore.App\7.0.5\Microsoft.DiaSymReader.Native.amd64.dll
C:\Program Files\dotnet\shared\Microsoft.NETCore.App\7.0.5\mscordaccore.dll
C:\Program Files\dotnet\shared\Microsoft.NETCore.App\7.0.5\mscordaccore_amd64_amd64_7.0.523.17405.dll
C:\Program Files\dotnet\shared\Microsoft.NETCore.App\7.0.5\mscordbi.dll
C:\Program Files\dotnet\shared\Microsoft.NETCore.App\7.0.5\mscorrc.dll
C:\Program Files\dotnet\shared\Microsoft.NETCore.App\7.0.5\msquic.dll
C:\Program Files\dotnet\shared\Microsoft.NETCore.App\7.0.5\System.IO.Compression.Native.dll