首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让Powershell从它刚刚加载的程序集中添加类型

如何让Powershell从它刚刚加载的程序集中添加类型
EN

Stack Overflow用户
提问于 2020-11-09 23:08:14
回答 1查看 347关注 0票数 2

我使用Add-Type加载了一个程序集:

代码语言:javascript
复制
 $Typename = '\\crtwfaadvlkv0.d2dbfg.com\PRODUCTION\Vision\Apps\VisionPipeline\Oracle.ManagedDataAccess.dll'
 Add-Type -LiteralPath $TypeName

并确认它已装入

代码语言:javascript
复制
> [appdomain]::CurrentDomain.GetAssemblies() |
>> Sort-Object -Property FullName |
>> Select-Object -Property FullName;

(partial results)

Oracle.ManagedDataAccess, Version=4.122.19.1, Culture=neutral, PublicKeyToken=89b483f429c47342

接下来,我想加载在程序集中定义的类,以便可以使用它们,但下面的错误如下:

代码语言:javascript
复制
> $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找不到它刚刚加载的程序集。我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2020-11-25 14:43:18

如果你不想添加两次,那么你就不需要第二次加载。

正如我在评论中提到的,只需在第一个“添加类型”命令中添加"-PassThru“参数即可。

代码语言:javascript
复制
$assemblyFilePath = '\\crtwfaadvlkv0.d2dbfg.com\PRODUCTION\Vision\Apps\VisionPipeline\Oracle.ManagedDataAccess.dll'
$assembly = Add-Type -LiteralPath $assemblyFilePath -PassThru

$assembly

但如果要重新加载它,请使用程序集限定名:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64754177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档