0

从 C# 代码中,我试图从 powershell 中检索所有命名空间......(后来更复杂的事情,比如创建命名空间)

PowerShell ps = PowerShell.Create();
ps.AddCommand("Import-Module").AddArgument("ServiceBus").Invoke();
var result = ps.AddCommand("Get-SBNamespace").Invoke();

上面的代码给出了以下异常:

在模块“ServiceBus”中找到“Get-SBNamespace”命令,但无法加载该模块。有关更多信息,请运行“Import-Module ServiceBus”。

有谁知道如何解决这个错误?

当前状态:经过一些调试后,我发现 PowerShell 对象中默认没有加载任何模块。使用代码:

InitialSessionState iss = InitialSessionState.CreateDefault();
iss.ImportPSModule(new string[]{@"serviceBus"});
PowerShell ps = PowerShell.Create(iss);

无法加载服务总线模块。还有代码:

ps.AddCommand("Import-Module").AddParameter("-Name", "serviceBus").Invoke();

无法导入服务总线模块。在管理员模式下运行 Visual Studio 也没有什么不同

提前致谢

4

4 回答 4

2

你没有说你使用的是哪个版本的 Visual Studio。如果是 VS 2012,当您尝试 x64 平台目标时,您是否确保未选中“首选 32 位”?即使它没有被检查尝试检查它,保存项目配置,清除它并再次保存 - 这对我在另一个项目中有用。

更新

在其他地方有人建议说,VS2012 中有一个错误,当它实际处于活动状态时,“首选 32 位”显示为灰色且未选中。我正在运行更新 2,但我没有看到。但听起来你可能是。我建议你直接编辑 .csproj 文件。

虽然“平台目标”设置为“任何 CPU”,但在解决方案资源管理器中,右键单击项目名称(或转到项目菜单)并选择“卸载项目”。项目文件将关闭,解决方案资源管理器将显示项目名称(不可用)> 项目文件已卸载:

卸载项目

再次右键单击项目名称并选择“编辑项目名称.csproj”。该文件是 XML,主要包含PropertyGroupItemGroup元素。在控制台项目中,第一个 PropertyGroup 通常包含一个 Platform 元素,如果您按照上面的说明进行操作,则该元素应为 AnyCPU。接下来的两个 PropertyGroups 通常用于调试和发布配置。如果您添加了另一个配置,它将拥有自己的 PropertyGroup。在每一个中,寻找一个元素:

<Prefer32Bit>true</Prefer32Bit>

你应该有一个元素,内容如下:

<Prefer32Bit>false</Prefer32Bit>

更改或插入它(在每个配置ProjectGroup 中),保存文件并关闭它。返回解决方案资源管理器,右键单击项目并选择“重新加载项目”。让我知道这是否解决了它。您可以通过获取结果来确认您的 PowerShell 现在正在运行 64 位

[System.IntPtr]::Size

例如

ps.AddScript("[System.IntPtr]::Size");

x86进程中为4 ,在x64进程中为8

我的项目是这样设置的,我能够使用以下方法加载 ServiceBus:

ps.AddCommand("Import-Module").AddArgument("ServiceBus");

希望你也会。

于 2013-05-05T08:27:58.873 回答
1

我没有安装 ServiceBus,所以我无法准确验证您尝试过的内容,但是

ps.AddCommand("Import-Module").AddArgument("ActiveDirectory").Invoke();

为我工作,所以你的原始语法看起来不错。

只是为了测试失败,我尝试了:

ps.AddCommand("Import-Module").AddArgument("CheeseDirectory");
ps.Commands.Commands[0].MergeMyResults(PipelineResultTypes.Error, PipelineResultTypes.Output);
var importResult = ps.Invoke();
foreach (PSObject result in importResult)
{
    Console.WriteLine(result);
}

并得到

未加载指定的模块“CheeseDirectory”,因为在任何模块目录中都找不到有效的模块文件。

你试过类似的吗?

于 2013-05-05T08:29:15.240 回答
0

您是否在 C# 程序中处理了您的 Assembly 目标(x86 与 X64)。该模块可能存在于一个目标中,而不存在于另一个目标中。PowerShell 存在于两者中。

于 2013-04-29T11:33:26.307 回答
0

似乎您正在尝试导入一些模块并在模块内执行 cmdlet 或函数,对吗?

所以我想你可以试试下面的代码:

PowerShell ps = PowerShell.Create();
Assembly ass = Assembly.LoadFile(@"yourServiceBus.dll");
ps.AddCommand("Import-Module").AddParameter("Assembly", ass).Invoke();
var result = ps.AddCommand("Get-SBNamespace").Invoke();

希望这会有所帮助。

于 2013-05-06T02:00:21.170 回答