使用 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 而不会出错。
问题
我正在尝试创建一个使用 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 而不会出错。