从 Powershell 调用 AppDomain.DoCallback

2023-12-29

这是基于 Stack Overflow 问题:如何在新的 AppDomain 中将程序集加载为仅反射? https://stackoverflow.com/questions/35249342/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,结果都是相同的

感谢任何帮助/指导


第一个想法:根本不要乱搞 AppDomains 并使用完全独立的process。至少,这些可以(相对)轻松地从 PowerShell 启动。缺点是,如果您对大量文件执行此操作,速度可能会慢得多。

$myAssemblyPath = "C:\..." 
$getImageRuntimeVersion = {
    [Reflection.Assembly]::ReflectionOnlyLoadFrom($input).ImageRuntimeVersion
}
$encodedCommand = [Convert]::ToBase64String(
    [Text.Encoding]::Unicode.GetBytes($getImageRuntimeVersion)
)
$imageRuntimeVersion = $myAssemblyPath | powershell -EncodedCommand $encodedCommand

那么,有没有办法在 PowerShell 中使用 AppDomains 来做到这一点呢?嗯,有,但不太漂亮。你不能使用AppDomain.DoCallBack因为,正如您所发现的,PowerShell 无法以这种方式进行远程委托(因为,在幕后,它会生成动态方法)。

然而,托管 PowerShell 运行时很容易,并且所有 PowerShell 对象都知道如何序列化(跨域远程处理的要求),因此在另一个 AppDomain 中调用 PowerShell 脚本相当简单(但仍然很难看):

$scriptInvokerAssembly = [System.IO.Path]::GetTempFileName() + ".dll"
Add-Type -OutputAssembly $tempAssembly -TypeDefinition @"
  using System;
  using System.Reflection;
  using System.Collections.Generic;
  using System.Management.Automation;

  public class ScriptInvoker : MarshalByRefObject {
    public IEnumerable<PSObject> Invoke(ScriptBlock scriptBlock, PSObject[] parameters) {
      using (var powerShell = PowerShell.Create()) {
        powerShell.Commands.AddScript(scriptBlock.ToString());
        if (parameters != null) {
          powerShell.AddParameters(parameters);
        }
        return powerShell.Invoke();
      }
    }
  }
"@
[Reflection.Assembly]::LoadFile($scriptInvokerAssembly) | Out-Null

Function Invoke-CommandInTemporaryAppDomain([ScriptBlock] $s, [object[]] $arguments) {
  $setup = New-Object System.AppDomainSetup
  $setup.ApplicationBase = Split-Path ([ScriptInvoker].Assembly.Location) -Parent
  $domain = [AppDomain]::CreateDomain([Guid]::NewGuid(), $null, $setup)
  $scriptInvoker = $domain.CreateInstanceAndUnwrap(
     [ScriptInvoker].Assembly.FullName, [ScriptInvoker]
  );
  $scriptInvoker.Invoke($s, $arguments)
  [AppDomain]::Unload($domain)
}

现在你可以做

Invoke-CommandInTemporaryAppDomain { 
  [Reflection.Assembly]::ReflectionOnlyLoadFrom($args[0]).ImageRuntimeVersion 
} $myAssemblyPath

请注意,我们必须在磁盘上生成一个临时程序集并具有AppDomain从那里加载它。这很丑,但你不能拥有Add-Type产生一个内存中的程序集,即使你最终得到了一个byte[]将其加载到另一个 AppDomain 中绝非易事,因为您无法挂钩AppDomain.AssemblyResolve在 PowerShell 中。如果此命令打包在模块中,您将编译包含以下内容的程序集ScriptInvoker提前,所以我不认为解决这个问题是一个优先事项。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Powershell 调用 AppDomain.DoCallback 的相关文章

随机推荐

  • checkbox数组返回nodejs中最后检查的值,而不是整个数组

    我试图通过 req body 从复选框中获取选中的值 如果我只检查一个就没有问题 并且在 req body 上有一个具有该值的对象 如果我检查多个 那么它会返回我连续检查的最后一个 我使用express ejs 和express json
  • 如何获得对 HTA 打开的对话框的 IE9 标准支持?

    我正在将一些旧的 HTA 从 Quirks 转换为 IE9 标准 但是 HTA 打开的模态和非模态对话框似乎不支持 IE9 标准模式 测试对话框
  • Phonegap如何获取应用程序内的应用程序名称?

    当我在手机上打开应用程序时 我想使用phonegap 获取应用程序的名称 并将该名称传递给网址 有没有办法获取应用程序名称 目前 我在应用程序打开时执行此操作 但我需要将应用程序的名称传递到 URL 的末尾 location href ht
  • Android File.delete 不起作用

    我尝试将图像文件保存到 SD 卡后删除它 但删除功能不起作用 任何帮助将不胜感激 这是我的代码 Save image to SD card String path Environment getExternalStorageDirector
  • JXL 数字格式和单元格类型

    我正在使用 JXL 编写 Excel 文件 客户希望某一列显示保留一位小数的数字 他们还希望细胞类型为 数字 当我使用以下 测试 代码时 数字显示正确 但单元格类型为 自定义 File excelFile new File C Users
  • 使用 InProcessPipelineRunner 执行时,PubsubReader 失败并出现 NullPointerException

    我有简单的管道 仅执行读取 PubsubIO Read subscription 在消耗大约 200 个元素后 每次运行都会失败 但有以下例外 error run main 0 java lang RuntimeException java
  • 如何使用 Wix 3.11 检查 .net Framework 4.7.1

    我正在尝试通过条件检查 Wix 3 11 的 net 版本 这在 4 5 之前都可以正常工作 如下所示
  • 如何使用 PDO 在 PHP 中打印 MySQL 数据库表

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想打印表格上的所有行 每一行都是论坛中问题的答案 用户可以删除行 我可以获取数据库中的整个表 但我不知道如何获得每一行 控制器 fo
  • android studio onMapReady 未调用

    我想将地图视图集成到我的一个视图中 我已经生成了一个新的地图片段 它以不同的视角出现 并且像魅力一样发挥作用 然后 我尝试将代码集成到正常活动中 带有操作栏等 它有点有效 在屏幕上显示得很好 但 onMapReady 在那种环境中永远不会被
  • django中的自定义用户模型不允许在admin中设置密码

    我创建了一个自定义用户模型 并在我的应用程序中成功使用了该模型 问题是 在管理中 在用户编辑屏幕上 我显示当前密码哈希 而不是用于设置密码的非常有用的界面 我在 Python 2 7 上使用 Django 1 5b1 为了管理用户界面 如何
  • 如何在 Java 8 中从有限流构建无限重复流?

    我怎样才能转动有限的事物流Stream
  • 更改 ionic 2 应用程序中的 iOS 状态栏颜色

    我正在按照 ionic 2 文档设置 iOS 状态栏颜色 但它不起作用 状态栏文本是白色的 这意味着在我的白色背景上它是不可见的 我在应用程序构造函数中放入的代码是 StatusBar overlaysWebView true Status
  • 从 Access DB 发送包含动态名称附件的电子邮件

    我不知道如何让这个东西继续工作 下面的代码发送一封电子邮件 其中包含 MS Access 2010 的附件 问题是 如果它需要固定的文件名 那么当我使用每个文件末尾的日期时 我的文件名会发生变化 示例 green 12 04 2012 cs
  • 使用 AWK 中的第一个字段作为文件名

    该数据集是一个包含三列的大文件 一个部分的 ID 一些不相关的内容和一行文本 示例可能如下所示 A01 001 This is a simple test A01 002 Just for exemplary purpose A01 003
  • 将 NServiceBus 与 Asp.Net MVC 2 结合使用

    有没有办法将 NServiceBus 与 Asp Net MVC 2 一起使用 我想将请求消息从 Asp Net MVC2 应用程序发送到服务 该服务处理该消息并回复响应消息 有没有办法清楚地做到这一点 NServiceBus 仅支持注册状
  • Jquery 冲突导致错误

    从事具有多种功能的项目 例如 谷歌翻译 图像滑块 使用画廊 弹出窗口 使用阴影框 JavaScript 水平菜单栏 Now we are getting jquery conflict in it and error message suc
  • 从 Docker 容器获取 Mac 地址

    是否可以从Docker容器中获取主机的MAC地址并将其写入文本文件中 docker inspect
  • GCS - Python 下载具有目录结构的 blob

    我使用 GCS python SDK 和 google API 客户端的组合来循环启用版本的存储桶并根据元数据下载特定对象 from google cloud import storage from googleapiclient impo
  • 计算负载并避免光标

    给出下面的表结构 它表示乘客通过门磁上下车的公交路线 而且 有一个人坐在那辆公共汽车上 手里拿着一个记着点数的剪贴板 CREATE TABLE BusLoad ROUTE CHAR 4 NOT NULL StopNumber INT NOT
  • 从 Powershell 调用 AppDomain.DoCallback

    这是基于 Stack Overflow 问题 如何在新的 AppDomain 中将程序集加载为仅反射 https stackoverflow com questions 35249342 how to load an assembly as