为什么我的.NET 4.0程序集不能使用Powershell注册到GAC?

时间:2013-11-13 22:35:58

标签: powershell .net-4.0 ssis gac

我正在使用.ps1脚本在生产Win 2008服务器r2上向GAC注册一组.NET 4.0程序集。程序集具有强名称,脚本不返回错误

[Reflection.Assembly]::LoadWithPartialName("System.EnterpriseServices");
[System.EnterpriseServices.Internal.Publish] $publish = New-Object System.EnterpriseServices.Internal.Publish;

$publish.GacInstall("D:\MyComponents\EZTrac.Domain.Dealer.dll")

运行之后,我会查看GAC_MSIL(它应该在哪里),然后查看GAC_32和GAC_64以获得良好的衡量标准,但它不属于任何一种。

我使用this post作为指南。知道我忘记了什么吗?

3 个答案:

答案 0 :(得分:5)

这是我为gaccing程序集编写的一个小函数函数。在这样做之前做了一些检查:

function Gac-Util
{
    param (
        [parameter(Mandatory = $true)][string] $assembly
    )

    try
    {
        $Error.Clear()

        [Reflection.Assembly]::LoadWithPartialName("System.EnterpriseServices") | Out-Null
        [System.EnterpriseServices.Internal.Publish] $publish = New-Object System.EnterpriseServices.Internal.Publish

        if (!(Test-Path $assembly -type Leaf) ) 
            { throw "The assembly $assembly does not exist" }

        if ([System.Reflection.Assembly]::LoadFile($assembly).GetName().GetPublicKey().Length -eq 0 ) 
            { throw "The assembly $assembly must be strongly signed" }

        $publish.GacInstall($assembly)

        Write-Host "`t`t$($MyInvocation.InvocationName): Assembly $assembly gacced"
    }

    catch
    {
        Write-Host "`t`t$($MyInvocation.InvocationName): $_"
    }
}

答案 1 :(得分:1)

经过测试后,我在原始问题下的评论是正确的。问题是PowerShell的v2无法注册.NET 4.0组件。为此,您必须安装WMF 3WMF 4,以便获得Powershell 3或4。

答案 2 :(得分:0)

正如您noted in the comments:在.Net 2.0中使用System.EnterpriseServices.Internal.Publish不允许您注册.Net 4.0程序集,如果出现任何问题,它不会返回任何错误。更新到PowerShell v3或更高版本或running older PowerShell versions using .Net 4.0是一种解决方案。阅读更多相关信息here

其他替代方案正在使用.Net 4.0 gacutil或查看我的PowerShell GAC module,它能够在PowerShell v2中安装.Net 4.0程序集,如果出现任何问题则会出错。