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

PowerShell脚本在从C#应用程序运行时的行为与从PowerShell ISE运行时的行为不同,c#,powershell,biztalk,powershell-ise,C#,Powershell,Biztalk,Powershell Ise,我正在尝试使用可用的PowerShell命令()自动化BizTalk部署。当我从PowerShell ISE UI运行脚本时,一切正常。但是我想为部署拥有自己的UI,这就是我的问题所在。脚本的行为不同,在某一点上找不到任何导致错误的资源(当前): 在中键入“Microsoft.BizTalk.ApplicationDeployment.ResourceCollection” 程序集“Microsoft.BizTalk.ApplicationDeployment.Engine”, 版本=3.0.1

我正在尝试使用可用的PowerShell命令()自动化BizTalk部署。当我从PowerShell ISE UI运行脚本时,一切正常。但是我想为部署拥有自己的UI,这就是我的问题所在。脚本的行为不同,在某一点上找不到任何导致错误的资源(当前):

在中键入“Microsoft.BizTalk.ApplicationDeployment.ResourceCollection” 程序集“Microsoft.BizTalk.ApplicationDeployment.Engine”, 版本=3.0.1.0,区域性=中性,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();
在ISE环境中,ConnectionString设置为有效值,但在C#情况下不设置。在第二种情况下,这会导致不存在资源:

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

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

我不能说自己在这方面有任何专业知识,但很明显,PowerShell ISE和您的托管环境之间存在某种环境差异


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

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

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

如合同上所述:

。。。否则,当您尝试访问资源集合时,您将 接收以下错误

在中键入“Microsoft.BizTalk.ApplicationDeployment.ResourceCollection” 程序集“Microsoft.BizTalk.ApplicationDeployment.Engine”, 版本=3.0.1.0,区域性=中性,PublicKeyToken=31bf3856ad364e35'是 未标记为可序列化

这是因为支持并行运行时,.NET 4.0 更改了它绑定到旧的混合模式程序集的方式。这些 例如,程序集是从C++\CLI编译的程序集。 混合模式程序集是根据的“v1.1.4322”版本构建的 运行时,如果没有额外的 配置信息

另外,在编写C#应用程序时,请注意,您可以在项目中引用
BizTalkFactory.Management.Automation.dll
BizTalkFactory.HealthAndActivity.Automation.dll
,并且无需PowerShell即可实现相同的功能:

BizTalk Factory Management Automation旨在成为BizTalk PowerShell提供程序的支持库,但它可以作为一个独立项目使用,而不依赖于PowerShell。这使它成为您自己的编程项目中管理和操作BizTalk工件的理想候选


是的,我也有类似的想法。这就是为什么我检查了输出的返回类型,它应该是完全可序列化的。可能这些BizTalk powershell函数在内部会导致序列化,但为什么只有在从C#调用时才会发生这种行为?我如何才能避免这种行为?打开fusion日志查看器FusLogVw.exe并监视程序集在不同场景中的加载方式可能是值得的。这可能会透露一些东西。我以前在这个博客页面上,但没有准确地阅读--我知道我可以直接使用管理对象,但我希望一些部署点可以通过脚本高度定制
<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
  </startup>
</configuration>