При попытке доступа к распределению WSL через wslapi в приложении WPF это указывает на то, что распространение не зарегистрировано, даже если оно определенно зарегистрировано. (Например, я могу запустить его из powershell и т. Д.)
Эта проблема возникает только в приложениях WPF (или, по крайней мере, в консольных приложениях).
Эта проблема внезапно появилась два дня назад, когда ее раньше не было.
У меня есть программа, которая взаимодействует с пользовательским дистрибутивом Linux в WSL. Дистрибутив не важен; что важно, это:
Программа при запуске использует wslapi (dll import), чтобы определить, установлен ли дистрибутив. Если он установлен, то он запускает программу. Если нет, он переходит к мастеру для загрузки дистрибутива wsl.
Пару дней назад УСТАНОВЛЕННАЯ версия программы (поэтому мы НЕ говорим об изменениях кода) внезапно перестала обнаруживать, что установлен дистрибутив WSL. На это указывает постоянное переключение на мастера, даже если дистрибутив установлен.
С тех пор я смог сузить обстоятельства сбоя при обнаружении установки до случаев, когда я НЕ в консольном приложении.
Чтобы устранить эту проблему, я создал одну библиотеку классов WslLink, которая имеет класс WslService, который выполняет этот код, чтобы определить, зарегистрирован ли дистрибутив:
[DllImport("wslapi.dll", CharSet = CharSet.Unicode)]
public static extern bool WslIsDistributionRegistered(string distributionName);
...
bool IsInstalled()
{
var isRegistered = WslIsDistributionRegistered("MyLinux");
return isRegistered;
}
Это тот же код, который работал в установленном приложении два дня назад.
В пустом приложении .NET Framework WPF, которое ссылается на описанный выше проект WslLink, у меня есть следующий код в App.OnStartup () (удалив параметр StartupUri из xaml):
var wslService = new WslService();
if (wslService.IsInstalled())
{
MessageBox.Show("The MyLinux is installed");
}
else
{
MessageBox.Show("The MyLinux is not installed");
}
Этот код отправляет сообщение с сообщением «MyLinux не установлен», что указывает на то, что дистрибутив не зарегистрирован в соответствии с wslapi.
В похожем базовом консольном приложении .NET Framework в том же решении и со ссылкой на тот же проект WslLink у меня есть:
var wslService = new WslService();
if (wslService.IsInstalled())
{
Console.WriteLine("The MyLinux is installed");
}
else
{
Console.WriteLine("The MyLinux is not installed");
}
Выводит «MyLinux установлен» - это означает, что дистрибутив IS зарегистрирован в соответствии с wslapi.
Ну, либо дистрибутив зарегистрирован, либо нет, и на основании того факта, что я могу запустить его из powershell, а такие команды, как wslconfig / l, показывают дистрибутив, это явно так.
Однако в любом случае, поскольку консольное приложение и приложение wpf используют ОДНОВРЕМЕННУЮ БИБЛИОТЕКУ КЛАССА для вызова проверки регистрации wslapi, я ожидаю, что оба они приведут к одному и тому же результату - либо оба говорят «не установлено» или оба говорят "установлено".
Но вместо этого приложение wpf всегда не может обнаружить установку, а консольное приложение всегда обнаруживает установку.
Чтобы повторить (я бью этот барабан очень сильно, потому что это просто не имеет смысла): УСТАНОВЛЕННОЕ wpf-приложение, которое выполняло идентичный код, работало в течение месяцев, а затем внезапно, пару дней назад это перестало работать. Я не говорю о переустановке или чем-то подобном. Я говорю о том, чтобы запустить его однажды, и вдруг он больше не обнаруживает установку.
Кто-нибудь знает что-нибудь, что могло измениться в Windows, чтобы вызвать это?