如何使Powershell从刚加载的程序集中添加类型

问题描述

我使用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