【问题标题】:How to get Powershell to add types from an assembly it just loaded如何让 Powershell 从刚加载的程序集中添加类型
【发布时间】:2020-11-09 15:08:14
【问题描述】:

我使用 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 命令(使用 LiteralPath)并将结果分配给变量。
  • 我不想加载它两次。我想我不明白这是如何运作的。我正在尝试加载 dll,然后在第二次调用中,将类型加载到命名空间中。我很困惑 Posh 找不到程序集,因为它刚刚加载了它。

标签: types .net-assembly powershell-5.0


【解决方案1】:

如果您不想添加两次,则不需要第二次加载。

正如我在评论中提到的,只需将“-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

【讨论】:

    猜你喜欢
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 2011-09-07
    • 2016-09-27
    • 2010-11-30
    • 1970-01-01
    相关资源
    最近更新 更多