问题描述
我使用Add-Type加载了程序集:
$Typename = '\\crtwfaadvlkv0.d2dbfg.com\PRODUCTION\Vision\Apps\VisionPipeline\Oracle.ManagedDataAccess.dll'
Add-Type -LiteralPath $TypeName
并确认已加载
> [appdomain]::CurrentDomain.GetAssemblies() |
>> sort-object -Property FullName |
>> Select-Object -Property FullName;
(partial results)
Oracle.ManagedDataAccess,Version=4.122.19.1,Culture=neutral,PublicKeyToken=89b483f429c47342
接下来,我想加载程序集中定义的类,以便可以使用它们,但是会出现以下错误:
> $oracletpe = Add-Type -AssemblyName 'Oracle.ManagedDataAccess' -Passthru
Add-Type : Cannot add type. The assembly 'Oracle.ManagedDataAccess' Could not be found.
At line:1 char:14
+ ... oracletpe = Add-Type -AssemblyName 'Oracle.ManagedDataAccess' -Passth ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Oracle.ManagedDataAccess:String) [Add-Type],Exception
+ FullyQualifiedErrorId : ASSEMBLY_NOT_FOUND,Microsoft.PowerShell.Commands.AddTypeCommand
Add-Type : Cannot add type. One or more required assemblies are missing.
At line:1 char:14
+ ... oracletpe = Add-Type -AssemblyName 'Oracle.ManagedDataAccess' -Passth ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidData: (:) [Add-Type],InvalidOperationException
+ FullyQualifiedErrorId : ASSEMBLY_LOAD_ERRORS,Microsoft.PowerShell.Commands.AddTypeCommand
因此,PowerShell似乎找不到它刚刚加载的程序集。我在做什么错了?
解决方法
如果不想添加两次,则不需要第二次加载。
如我的评论中所述,只需将“ -PassThru”参数添加到第一个“ Add-Type”命令。
$assemblyFilePath = '\\crtwfaadvlkv0.d2dbfg.com\PRODUCTION\Vision\Apps\VisionPipeline\Oracle.ManagedDataAccess.dll'
$assembly = Add-Type -LiteralPath $assemblyFilePath -PassThru
$assembly
但是,如果要重新加载它,请使用程序集限定名称:
Add-Type -AssemblyName 'Oracle.ManagedDataAccess,Version=4.122.19.1,Culture=neutral,PublicKeyToken=89b483f429c47342' -PassThru
通常,仅允许全局程序集缓存(GAC)中的程序集和应用程序文件夹中的程序集(递归)使用部分名称。 (但是有一些特殊的扩展名,例如SQL Server的“主机集存储”等)。
但是不要将“应用程序文件夹”与脚本所在的文件夹混淆。它是PowerShell应用程序文件夹:%WinDir%\System32\WindowsPowerShell\v1.0\
如果要测试它,只需将DLL放在该文件夹中,然后启动新的powershell控制台即可。
有关程序集加载的更多信息(尤其是部分名称):https://docs.microsoft.com/en-us/dotnet/framework/deployment/best-practices-for-assembly-loading#avoid-binding-on-partial-assembly-names