2015-08-28 11 views
2

运行时,PowerShell脚本的行为有所不同我试图使用可用的PowerShell命令(https://psbiztalk.codeplex.com)自动化BizTalk部署。当我从PowerShell ISE UI运行我的脚本时,情况正在发生变化。但是我想为自己的UI部署我自己的用户界面,这就是我的问题所在。该脚本的行为不同,没有发现在一个点上,这导致错误(目前)的任何资源。从C#应用程序,然后从PowerShell ISE

类型“Microsoft.BizTalk.ApplicationDeployment.ResourceCollection”在 大会“Microsoft.BizTalk.ApplicationDeployment.Engine, Version = 3.0.1.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'是 未标记为可序列化。

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(); 

UPDATE

由于在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不行为相同的方式。对此发现有何更多想法?

回答

1

尝试在你的配置文件更改启动方式:

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

至于写在BizTalk360 Blog

...否则当您尝试访问的资源集合,你会 收到以下错误

键入'Microsoft.BizTalk.ApplicationDeployment。ResourceCollection'in Assembly'Microsoft.BizTalk.ApplicationDeployment.Engine, Version = 3.0.1.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'is 未标记为可序列化。

这是因为支持并行运行时,.NET 4.0有 改变了它绑定到旧的混合模式程序集的方式。例如,这些 程序集是从C++ \ CLI编译的程序集。 混合模式程序集针对 运行时的版本'v1.1.4322'构建,无需在4.0运行时加载,但无需其他 配置信息。

而且,你正在编写C#应用程序,要注意的事实是,你可以参考在项目中BizTalkFactory.Management.Automation.dllBizTalkFactory.HealthAndActivity.Automation.dll,实现同样的事情,而不需要PowerShell的:

的BizTalk Factory Management Automation旨在成为BizTalk PowerShell Provider的支持库,但它可以用作不会对PowerShell产生任何依赖关系的独立项目。这使得它成为您在编程项目中使用BizTalk工件的理想候选人。 psbiztalk on CodePlex

+0

我之前在此博客页面上,但没有通过准确读取它。 - 我知道我可以直接使用管理对象,但我希望通过脚本高度定制一些部署点 – Scoregraphic

1

我不能说在这方面有任何专业知识,但看起来很清楚PowerShell ISE和您的托管环境之间存在某种环境差异。

运行时抱怨某些不可序列化的东西表明它正在跨过进程边界进行编组,或者可能在应用程序域之间进行编组,这两者都需要对象可序列化。您的对象是否被加载到不同的AppDomain中?

+0

是的,我也有类似的想法。这就是为什么我检查应该是完美序列化的输出的返回类型。也许这些BizTalk PowerShell功能在内部做了一些导致序列化的事情,但是为什么只有在从C#调用并且我怎样才能规避这种行为呢? – Scoregraphic

+0

可能需要打开fusion日志查看器FusLogVw.exe,并监视组件在不同场景下的装载方式。它可能会揭示一些事情 –