使用 SimpleInjector 的二进制 PowerShell Core cmdlet 导致 FileNotFoundException

Binary PowerShell Core cmdlet using SimpleInjector results in FileNotFoundException

问题

我正在尝试创建一个使用 SimpleInjector 的 PowerShell Core 二进制 cmdlet 库,但无法弄清楚为什么在使用 Visual Studio 调试它时会导致 FileNotFoundException

详情

我在 Visual Studio 中创建了一个超级简单的 PowerShell cmdlet 库,目标是 .NET Standard 2.0 并使用 PowerShellStandard.Library package (v5.1.0-RC1). You can view/clone it here。它包含以下 cmdlet:

using System.Management.Automation;
using Newtonsoft.Json.Linq;
using SimpleInjector;

[Cmdlet(VerbsDiagnostic.Test, "SimpleInjectorDependency")]
public class TestSimpleInjectorDependencyCmdlet : PSCmdlet
{
    protected override void ProcessRecord()
    {
        var container = new Container();
        WriteObject("Success!");
    }
}

结果是 FileNotFoundException:

似乎 特定于 SimpleInjector 因为用 json.net 做同样的事情运行没有问题:

using System.Management.Automation;
using Newtonsoft.Json.Linq;
using SimpleInjector;

[Cmdlet(VerbsDiagnostic.Test, "JsonDotNetDependency")]
public class TestJsonDotNetDependencyCmdlet : PSCmdlet
{
    protected override void ProcessRecord()
    {
        var j = new JObject();
        WriteObject("Success!");
    }
}

我真的不明白这里发生了什么。我什至不确定这是否真的是 SimpleInjector 特有的,或者是否还有其他因素在起作用。如果有人能赐教,我将不胜感激!

我不确定这是最好的解决方案,但我终于找到了解决问题的办法:

首先,我添加了一个 post-构建事件:dotnet publish --no-build

其次,在项目的 "Debug" 选项卡中,我将 "Application arguments" 更改为从 \bin\Debug\netstandard2.0\publish\ 目录而不是 \bin\Debug\netstandard2.0\ 导入我的 cmdlet 模块。所以,而不是这个:

-NoExit -NoLogo -NoProfile -Command "Import-Module .\MyNetStandardProject.dll"

我用过这个:

-NoExit -NoLogo -NoProfile -Command "Import-Module .\publish\MyNetStandardProject.dll"

如图所示:

一旦我这样做了,我就能够 运行 我的问题中描述的 Test-SimpleInjectorDependency cmdlet 而不会出错。