c# - 从 C# 应用程序运行时 PowerShell 脚本的行为与从 PowerShell ISE 运行时的行为不同

标签 c# powershell biztalk powershell-ise

我正在尝试使用可用的 PowerShell 命令 ( https://psbiztalk.codeplex.com ) 自动执行 BizTalk 部署。当我从 PowerShell ISE UI 运行脚本时,一切正常。但我想要有自己的 UI 来进行部署,这就是我的问题所在。该脚本的行为有所不同,并且在某一点找不到任何资源,这会导致错误(当前):

Type 'Microsoft.BizTalk.ApplicationDeployment.ResourceCollection' in Assembly 'Microsoft.BizTalk.ApplicationDeployment.Engine, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' is not marked as serializable.

Get-ApplicationResourceSpec 的输出将是一个 System.Xml.XmlDocument 对象。看起来该命令无法从托管的 PowerShell 内容中找到 BizTalk 应用程序资源,但 ISE 环境可以,因此我认为这应该以某种方式可行。

任何想法和/或帮助表示赞赏。

PowerShell 脚本:

$SnapIn = Get-PSSnapin | Where-Object { $_.Name -eq "BizTalkFactory.PowerShell.Extensions" }
if ($SnapIn -eq $null)
{
    Add-PSSnapin -Name "BizTalkFactory.Powershell.Extensions"
}

Set-Location -Path BizTalk:
cd "BizTalk:\Applications"
Get-ApplicationResourceSpec -Path "MyTestApplication"

从 C# 应用程序调用

string script = File.ReadAllText("GetResources.ps1")));

Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.Open();

Pipeline pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript(script);

StringBuilder builder = new StringBuilder();
Collection<PSObject> objects = pipeline.Invoke();
foreach (PSObject obj in objects.Where(t => t != null))
{
    builder.AppendLine(obj.ToString());
}

runspace.Close();

更新

由于 BizTalk PowerShell 命令是开源的,因此我进行了更深入的研究并尝试隔离失败的命令。我发现以下代码给出了不同的结果:

# Replace Get-ApplicationResourceSpec -Path "MyTestApplication" from the
# other script with these lines
$App = Get-ChildItem | Where-Object { $_.Name -eq $Application } | Select-Object -First 1
$Group = New-Object Microsoft.BizTalk.ApplicationDeployment.Group
$Group.DBName = $App.Catalog.Database
$Group.DBServer = $App.Catalog.Instance
$Group.SqlConnection.ConnectionString

在 ISE 环境中,ConnectionString 设置为有效值,但在 C# 情况下则不然。这会导致第二种情况下资源不存在:

$App = $Group.Applications["MyTestApplication"]
$App.ResourceCollection.Count # equals 88 vs. 0

因此,BizTalk 内部类型 Microsoft.BizTalk.ApplicationDeployment.Group 的行为方式似乎不同。关于这一发现还有更多想法吗?

最佳答案

尝试更改配置文件中的启动模式:

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
  </startup>
</configuration>

BizTalk360 Blog 上所写:

... else when you try to access the resource collection, you’ll receive the following error

Type ‘Microsoft.BizTalk.ApplicationDeployment.ResourceCollection’ in Assembly ‘Microsoft.BizTalk.ApplicationDeployment.Engine, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35′ is not marked as serializable.

这是因为.NET 4.0 支持并行运行时 改变了它绑定(bind)到旧的混合模式程序集的方式。这些 例如,程序集是从 C++\CLI 编译的程序集。 混合模式程序集是针对版本“v1.1.4322”构建的 运行时并且无法在 4.0 运行时中加载而不需要额外的 配置信息。

此外,当您编写 C# 应用程序时,请注意您可以引用 BizTalkFactory.Management.Automation.dllBizTalkFactory.HealthAndActivity.Automation.dll在您的项目中,无需使用 PowerShell 即可实现相同的目标:

The BizTalk Factory Management Automation is designed to be a supporting library for the BizTalk PowerShell Provider, but it can be used as a standalone project that does not incur any dependencies on PowerShell. This makes it an ideal candidate for use in your own programming projects around administrating and manipulating BizTalk artifacts. psbiztalk on CodePlex

关于c# - 从 C# 应用程序运行时 PowerShell 脚本的行为与从 PowerShell ISE 运行时的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32275697/

相关文章:

c# - 部署 Angular 6 ASP.NET Core 应用程序

c# - 显示多对多关系(嵌套 ListViews?)

c# - 如何避免继承类必须传递基类构造函数参数

powershell - 在 Powershell 中工作时,如何在列表项之间暂停?

c# - BizTalk 服务器问题

biztalk - 在 biztalk Server 2006 中将图像文件作为消息发送

c# - 使用 CUI 测试生成器测试 winform 应用程序上的接受按钮

powershell - New-ScheduledTaskSettingsSet 过期任务

powershell - 在Powershell GUI中动态填充文本框中的文本

msbuild - Microsoft.Sdc.Tasks.BizTalk2004.Host.Delete错误,但不使用Biztalk吗?