2015-08-28 22 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,並監視組件在不同場景下的裝載方式。它可能會揭示一些事情 –

相關問題