Я пришел к решению.Однако кажется, что в настоящее время Mono очень нестабилен на LLVM, поэтому приведенный ниже код C # является теоретическим (я мог бы проверить его только без LLVM).
Идея
Спасибо arnt, который дал мнеИдея проверить подключенные библиотеки.LLVM загружается, если во время выполнения mono
открывается библиотека с именем libmono-llvm.so
.Из этого мы можем вывести способ bash и C #, чтобы определить, используем ли мы LLVM или нет.
Внимание : это работает только в Linux (поскольку использует procfs)
Использование bash
Учитывая mono
pid в качестве $1
параметра, следующая команда возвращает 1
, если используется LLVM, 0
в противном случае.
find /proc/$1/map_files/ -maxdepth 1 -type l -ls | grep libmono-llvm.so | head -1 | wc -l
Во время выполнения в C #
using System.Diagnostics;
using System.IO;
using Mono.Unix;
public static class LlvmInformation
{
private static bool? _isLlvmEnabled;
/// <summary>
/// Gets a value indicating whether Mono uses LLVM.
/// </summary>
/// <value>
/// <c>true</c> if this instance is LLVM enabled; otherwise, <c>false</c>.
/// </value>
public static bool IsLlvmEnabled
{
get
{
if (!_isLlvmEnabled.HasValue)
_isLlvmEnabled = LoadLlvmEnabled();
return _isLlvmEnabled.Value;
}
}
private static bool LoadLlvmEnabled()
{
var pid = Process.GetCurrentProcess().Id;
var mapFilesDirectory = $"/proc/{pid}/map_files";
var mapFiles = Directory.EnumerateFiles(mapFilesDirectory);
foreach (var mapFile in mapFiles)
{
var symbolicLinkInfo = new UnixSymbolicLinkInfo(mapFile);
if (symbolicLinkInfo.FileType == FileTypes.SymbolicLink
&& symbolicLinkInfo.GetContents().Name.Contains("libmono-llvm.so"))
return true;
}
return false;
}
}
Удачи с этим!