为什么WslApi突然停止在WPF应用程序中工作

时间:2019-04-15 01:14:05

标签: c# wpf windows-subsystem-for-linux

当尝试通过WPF应用程序中的wslapi访问WSL发行版时,它指示该发行版尚未注册,即使它确实已注册。 (例如,我可以从powershell等启动它。)

该问题似乎仅在WPF应用程序中发生(或者至少在控制台应用程序中没有发生)。

此问题在两天前突然出现,而之前却不存在。

我有一个程序可以与WSL中的自定义Linux发行版进行交互。发行版并不重要;重要的是:

程序在启动时使用wslapi(dll导入)检测是否已安装发行版。如果已安装,则它将启动程序。如果没有,它将转至向导来加载wsl发行版。

几天前,该程序的INSTALLED版本(因此我们不谈论代码更改)突然停止检测到已安装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()中具有以下代码(已从xaml中删除了StartupUri设置):

    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 Console应用程序中,并引用相同的WslLink项目,我有:

    var wslService = new WslService();

    if (wslService.IsInstalled())
    {
        Console.WriteLine("The MyLinux is installed");
    }
    else
    {
        Console.WriteLine("The MyLinux is not installed");
    }

这将输出“已安装MyLinux”-表示发行版是根据wslapi注册的。

好吧,发行版是否已注册,或者没有注册,并且基于我可以从powershell启动它的事实,而wslconfig / l之类的命令显示了发行版,显然是。

但是,无论哪种情况,由于控制台应用程序和wpf应用程序都使用SAME CLASS LIBRARY来调用wslapi注册检查,所以我希望它们都能产生相同的结果-都说“未安装”或都说“已安装”。

但是,相反,wpf应用程序始终无法检测到安装,而控制台应用程序始终可以检测到安装。

要重申一下(我真的很难打败这个鼓,因为那没有意义):运行相同代码的INSTALLED wpf应用程序已经工作了几个月,然后突然出现了几天以前,它停止工作了。我不是在说重新安装或类似的事情。我说的是有一天要启动它,突然间它不再检测安装了。

有人知道Windows中可能导致此变化的任何内容吗?

1 个答案:

答案 0 :(得分:1)

我发现Windows自动更新KB4493464中断了来自WPF应用程序的wslapi调用。这就是为什么已安装的程序突然停止工作的原因。我通过A / B / A测试验证了这一点(先备份更新以进行验证,然后重新应用)。

感谢@Biswapriyo的建议,但是LxssManager在所有情况下都运行,这就是控制台应用程序能够正常工作的原因。

我已经通知了Microsoft,但是我不希望采取任何措施来解决此问题。我确定此API仅考虑了控制台应用程序用例,因此我们不能从GUI应用程序中使用它的事实可能不是优先事项。