【发布时间】:2017-08-10 08:10:12
【问题描述】:
这是基于堆栈溢出问题:How to load an assembly as reflection-only in a new AppDomain?
我正在尝试确定程序集的运行时版本,但是当我遍历嵌套文件夹时,该程序集可能会被加载多次。使用
直接加载程序集[Reflection.Assembly]::ReflectionOnlyLoadFrom($assembly)
因此无法工作,因为程序集只能在应用程序域中加载一次。
给定以下函数以在单独的 AppDomain 中加载程序集:
function Load-AssemblyInNewAppDomain($assembly)
{
Write-Host $assembly.FullName
$domain = [AppDomain]::CreateDomain([Guid]::NewGuid())
$domain.DoCallback
({
$loaded = [Reflection.Assembly]::Load($assembly)
$runtime = $loaded.ImageRuntimeVersion
Write-Host $runtime
})
}
这会将委托的内容输出到控制台,而不是执行它:
OverloadDefinitions
-------------------
void DoCallBack(System.CrossAppDomainDelegate callBackDelegate)
void _AppDomain.DoCallBack(System.CrossAppDomainDelegate theDelegate)
$loaded = [Reflection.Assembly]::Load($assembly)
$runtime = $loaded.ImageRuntimeVersion
Write-Host $runtime
请注意,无论我使用 PowerShell 4 还是 5,结果都是一样的
感谢任何帮助/指导
【问题讨论】:
-
去掉 DoCallback 和左括号之间的换行符
-
删除换行符现在允许块执行,但失败:异常调用“DoCallBack”与“1”参数:“无法序列化非托管函数指针、动态方法或外部方法的委托委托创建者的程序集。”
标签: powershell reflection