2011-07-02 9 views
2

System.Activitiesワークフローアクティビティをツールボックスに追加できるPowerShellスクリプト(NuGet用)を作成しています。PowerShellスクリプトからツールボックスにワークフローアクティビティを追加する際に問題が発生する

現在、私はそれらをコマンドレットとして書かれたC#コードでインストールしていますが、NuGetにアセンブリがロードされていて削除できないため、パッケージをアンインストールしようとすると問題が発生します。

私の目標は、PowerShellからすべてを行うことです。そのため、アセンブリを読み込む必要はありません。私はツールボックス項目を追加する最後の行を除いて、 "Object on IConvertibleを実装する必要があります。これは、私がそれに渡しているものが間違ったタイプだと思うと信じています。ツールボックスにタブを追加するので、$ toolboxインターフェイスが動作していることがわかります。

function AddActivity ( 
[string] $activity, 
[string] $assemblyFullname, 
[string] $name, 
[string] $category, 
[string] $bitmapPath) 
{ 
    Write-Host "Argument List" 
    Write-Host $activity 
    Write-Host $assemblyFullname 
    Write-Host $name 
    Write-Host $category 
    Write-Host $bitmapPath 

    Write-Host "Loading assemblies" 
    $assembly = [Reflection.Assembly]::Load("Microsoft.VisualStudio.Shell.Interop") 

    Write-Host "get the toolbox service" 
    Write-Host "get the toolbox service" 
    $ServiceType = [System.Type]::GetType("Microsoft.VisualStudio.Shell.Interop.SVsToolbox,{0}" -f $assembly.FullName)  
    $InterfaceType = [System.Type]::GetType("Microsoft.VisualStudio.Shell.Interop.IVsToolbox,{0}" -f $assembly.FullName) 
    $toolbox = Get-VSService $ServiceType $InterfaceType  

    Write-Host "Add a Tab" 
    $tlBoxTab = $toolbox.AddTab($category) 

    Write-Host "Create the DataObject" 
    $dataObject = New-Object Microsoft.VisualStudio.Shell.OleDataObject 
    $dataObject.SetData("AssemblyName", $assemblyFullname) 
    $dataObject.SetData("CF_WORKFLOW_4", $name) 
    $dataObject.SetData("WorkflowItemTypeNameFormat", ('{0}{1}' -f $activity, $assemblyFullname)) 

    Write-Host "Load the bitmap {0}" $bitmapPath 
    Write-Host "$bitmapPath" 
    $bitmap = new-object System.Drawing.Bitmap $bitmapPath 

    $toolboxItemInfo = new-object Microsoft.VisualStudio.Shell.Interop.TBXITEMINFO; 
    $toolboxItemInfo.bstrText = $name 
    $toolboxItemInfo.hBmp = $bitmap.GetHbitmap() 
    $toolboxItemInfo.clrTransparent = [System.UInt32][System.Drawing.ColorTranslator]::ToWin32([System.Drawing.Color]::White) 

    #Create an array with one element 
    $tbiArray = [Microsoft.VisualStudio.Shell.Interop.TBXITEMINFO[]] ($toolboxItemInfo) 

    Write-Host "Add the item - this will blow up" 
    $toolbox.AddItem($dataObject, $tbiArray, $category) 

    # Exception calling "AddItem" with "3" argument(s): "Exception calling "InvokeMethod" with "3" argument(s): "Object must implement IConvertible."" 
    # At C:\users\rojacobs\documents\visual studio 2010\Projects\WorkflowConsoleApplication24\packages\Microsoft.Activities.1.8.4.630\tools\install.ps1:53 char:21 
    # +  $toolbox.AddItem <<<< ($dataObject, $tbiArray, $category)  
    #  + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    #  + FullyQualifiedErrorId : ScriptMethodRuntimeException 
} 
+0

Hey! Mr Ron Server AppFabric Jacobs!私はあなたのためにこれを見ていきます(多くのPowerShellのものを担当するNuGetコア開発者であり、MS powershell MVPは私をよく熟知させてくれます - そしてまた私はあなたの勝利サーバーappfabric仕事を愛しています:)) – x0n

+0

btw、これらの問題の多くは、COMオブジェクトがタイプライブラリで動作する「アダプタ」でラップされ、インタラクティブでスクリプティングの使用に最適化されたユーザーフレンドリーなエクスペリエンスを提供するため、powershellで発生します。多くの場合、あなたはPIAや未処理のCOM参照を渡していると思いますが、そうではありません。これは、PIAなどが必要な管理対象APIを呼び出そうとしているとき、さまざまな問題につながります。 – x0n

+0

はい - 私は内部の人々の大部分にこの1つを困らせました。これまでに学んだことは、NuGetConsole.Host.MethodBinder.ChangeTypeが何かの型を変更する必要があると考えているため、例外が実際にスローされているということです。私はNuGetの人に助けを頼んだので、何が現れるかを見ていきます。 –

答えて

0

ロン、私は問題がカテゴリを取り巻くかもしれないと信じています。私が見たドキュメンテーションによれば、そのカテゴリは、リカバリできるローカライズされた名前(http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.ivstoolbox.additem.aspx)である必要がありますGetIDOfTab(http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.ivstoolbox3.getidoftab.aspx)を使用します。

これが役立つかどうか教えてください。

関連する問題