Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 添加类型-ReferencedAssembly失败,无法加载或查找程序集。解决方案_Powershell - Fatal编程技术网

Powershell 添加类型-ReferencedAssembly失败,无法加载或查找程序集。解决方案

Powershell 添加类型-ReferencedAssembly失败,无法加载或查找程序集。解决方案,powershell,Powershell,解决这个问题的办法是将DLL添加到GAC中,正如在我的帖子的一个回复中所建议的那样。正如我在一份回复中所指出的,在需要运行此流程的环境中,gacutility将不可用。正因为如此,简单的间隙解决方案不是一个选择。为了解决这个问题,我派生了一个Posh函数,该函数将向GAC添加DLL: 参数([string]$dllPath) [字符串]$publicToken=$null [字符串]$val=$null [字符串]$version=$null if(测试路径)$dllPath) { $baseF

解决这个问题的办法是将DLL添加到GAC中,正如在我的帖子的一个回复中所建议的那样。正如我在一份回复中所指出的,在需要运行此流程的环境中,gacutility将不可用。正因为如此,简单的间隙解决方案不是一个选择。为了解决这个问题,我派生了一个Posh函数,该函数将向GAC添加DLL:

参数([string]$dllPath)

[字符串]$publicToken=$null [字符串]$val=$null [字符串]$version=$null

if(测试路径)$dllPath) { $baseFileName=[System.IO.Path]::GetFileNameWithoutExtension($dllPath) $targetName=“c:\windows\assembly\GAV_MSIL\”+$baseFileName

# Get the key and public token
$val = sn -Tp $dllPath

# Get the version w/o loading
$version = [System.reflection.AssemblyName]::GetAssemblyName($dllPath).Version

# Proceed if the token is valid
if ($val -ne -null)
{
    $vals = $val.split(" ")
    $publicToken = $vals[$vals.length-1]
    $targetNameSub=$targetName + "\" + $version + "__" + $publicToken

    if (!(test-path $targetName))
    {
        Md $targetName | Out-Null
    }

    Md $targetNameSub | Out-Null

    # Copy the DLL to the GAC
    copy-item $dllPath $targetNameSub | Out-Null
}
}

我已经测试过了,效果很好。在我的研究中,我发现了一些东西,表明我没有做的事情是,同性恋者将条目输入注册表。但是这个函数确实工作得很好


我曾尝试反向使用一个Posh函数来删除GAC条目,但每次在删除DLL文件时被拒绝访问时,我都没有成功。

听起来问题在于
tools.Utilities.DLL本身是可以的,但如果它的依赖项在
c:\Program Files\subDir
。这是由错误消息和将DLL移动到其他文件夹修复问题这一事实所建议的。新文件夹中可能存在缺少的依赖项

验证这一点的最简单方法是使用fuslogvw.exe查看阻止加载
tools.Utilities.dll
的确切错误


听起来问题在于
tools.Utilities.dll
本身没有问题,但如果它的依赖项在
c:\Program Files\subDir
中不可用,则是一个问题。这是由错误消息和将DLL移动到其他文件夹修复问题这一事实所建议的。新文件夹中可能存在缺少的依赖项

验证这一点的最简单方法是使用fuslogvw.exe查看阻止加载
tools.Utilities.dll
的确切错误

将组件添加到您的:

将程序集添加到您的应用程序:


.NET程序集加载不使用PATH env变量。它要么从应用程序的基本目录加载(正如您在将dll复制到PowerShell基本目录时所看到的),要么按照@critobalito的建议从GAC加载。您有几个选项可以修改此行为。您可以添加一个探测目录(参见本文)。您还可以钩住AppDomain.ResolveEvent,以便有机会从任意位置加载程序集。就我个人而言,我会在上面的C#代码中这样做。NET程序集加载不使用PATH env变量。它要么从应用程序的基目录加载(正如您在将dll复制到PowerShell基目录时所看到的),要么按照@critobalito的建议从GAC加载。您有几个选项可以修改此行为。您可以添加一个探测目录(参见本文)。您还可以钩住AppDomain.ResolveEvent,以便有机会从任意位置加载程序集。就我个人而言,我会在上面的C代码中这样做。gacutil选项似乎是最直接的解决方案。但是,当我尝试将DLL添加到GAC时,我收到一个错误,该错误表示“将程序集添加到缓存失败:未知错误。我尝试了一个指向程序集的路径,然后cd'd指向dll目录,并尝试了同样的方法。但我收到了同样的错误。不确定从何处查找有关错误的详细信息。我发现我使用的gacutil来自.NET 1.x版本。不幸的是,尽管交付的软件将低于.NET 3.5或更高版本,但GAC将不属于已安装系统的一部分。如果我手动将文件复制到gac,我可以使用这个类和方法而不会出错。既然GAC是一个视图,那么有可能编写一个模仿gacutility行为的powershell脚本吗?对不起,不知道。为什么你不能在安装中使用GAC?我不是一个部署专家(我自己也不真正使用它),所以很抱歉我不能提供更多帮助。如果有兴趣,可以将DLL添加到GAC中而不使用gacutility。GAcutili选项似乎是最直接的解决方案。但是,当我尝试将DLL添加到GAC时,我收到一个错误,该错误表示“将程序集添加到缓存失败:未知错误。我尝试了一个指向程序集的路径,然后cd'd指向dll目录,并尝试了同样的方法。但我收到了同样的错误。不确定从何处查找有关错误的详细信息。我发现我使用的gacutil来自.NET 1.x版本。不幸的是,尽管交付的软件将低于.NET 3.5或更高版本,但GAC将不属于已安装系统的一部分。如果我手动将文件复制到gac,我可以使用这个类和方法而不会出错。既然GAC是一个视图,那么有可能编写一个模仿gacutility行为的powershell脚本吗?对不起,不知道。为什么你不能在安装中使用GAC?我不是一个部署专家(我自己也不使用它),所以很抱歉我不能提供更多的帮助。如果有兴趣,可以将DLL添加到GAC中,而不需要使用GAC。
gacutil /i Assembly.dll