解决此问题的方法是将DLL添加到GAC中,正如我在其中一条回复中所建议的那样。正如我在其中一个回复中指出的那样,在这个过程需要运行的环境中,缺乏可用性。因为这个原因,简单的解决方案不是一种选择。要解决这一点,我得出一个豪华的功能,将DLL文件添加到GAC:Add-Type -ReferencedAssemblies失败,无法加载或找到程序集。解决方案
参数([字符串] $的DLLPath)
[字符串] $ publicToken = $空 [字符串] $ VAL = $空 [字符串] $版本= $空
如果(测试路径)$的DLLPath) { $ baseFileName = [System.IO.Path] :: GetFileNameWithoutExtension($的DLLPath) $目标名称=“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文件删除。
.NET程序集加载不使用PATH的环境变量。它可以从应用程序的基本目录加载它(正如您将dll复制到PowerShell基本目录时所看到的),也可以像@critobalito建议的那样从GAC加载它。您有几个修改此行为的选项。您可以添加探测目录(请参阅此文章http://msdn.microsoft.com/en-us/library/15hyw9x3(VS.71).aspx)。您也可以挂接AppDomain.ResolveEvent,以便有机会从任何您想要的地方加载程序集。我个人会在上面的C#代码中执行此操作。 – 2010-09-27 20:21:13