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