Powershell:无法与 .Net 程序集中存储的表单交互

2023-12-27

我只是想学习这个东西,并且将来想在我的一个项目中使用它。

我有一个带有简单文本框的小表单,存储在 .Net dll (C#) 中。这是我在这个 dll 中的类,其中包含与此表单交互的方法:

using System;
using System.Collections.Generic;
using System.Text;

namespace ClassLibrary1
{
    public class Class1
    {
        static Form1 dlg = new Form1();

        public static void ShowForm()
        {
            dlg.ShowIcon = true;
            dlg.Show();

        }

        public static void SetText(string MyText)
        {
            dlg.Text = "Form Text ";
            dlg.SetText(MyText);

        }
    }
}

通过在调用其方法时引用此 dll 到另一个 C# 应用程序中,成功加载了此表单:

private void button1_Click(object sender, EventArgs e)
{
    ClassLibrary1.Class1.ShowForm();
}

我能够与表单完美交互。

现在使用以下命令在 Powershell 中加载相同内容:

[Reflection.Assembly]::LoadFile("D:\Playing\ClassLibrary1\ClassLibrary1\bin\Debug\ClassLibrary1.dll")
[ClassLibrary1.Class1]::ShowForm()

现在,它已成功加载到其默认位置,但我无法与此表单交互,即我无法在其文本框中键入内容,我也无法通过单击右侧的“关闭”(x) 按钮来移动甚至关闭此表单角落。每当我将鼠标放在它上面时,它就会变成沙漏,即等待某个进程。

为了验证表单是否没有挂起,我在 Powershell 提示符下调用了 SetText:

[ClassLibrary1.Class1]::SetText("String from Powershell")

效果很好。 TextBox 正确接收了此文本,但我仍然无法使用鼠标与表单交互。

我觉得,我必须手动设置其窗口处理程序,即 System.Windows.Forms.IWin32Window。 但我不知道哪个Handler以及如何实现这一点?

请指导....非常感谢任何替代技巧。


您无法使用 PowerShell 显示表单Form.Show()方法,因为它需要消息泵(并且 PowerShell 主机进程不提供)。

您可以采取以下措施来解决此问题:

  • Use Form.ShowDialog() or Application.Run(),您的表单将有自己的消息泵。
  • 它将是模态的,然后您需要在另一个线程中运行它。我建议使用后台线程BeginInvoke()在你的SetText() method.

这里是执行此操作的代码(我不会对您的代码进行太多更改,因此我会将其保留为单例实例,即使这会阻止多次显示表单)。代码只是一个示例(我不建议使用线程池来完成此任务)来说明该过程。

public static void ShowForm()
{
    if (dlg != null)
        dlg.BeginInvoke(new MethodInvoker(delegate { dlg.Dispose(); }));

    ThreadPool.QueueUserWorkItem(delegate(object state)
    {
        Application.Run(_dlg = new Form1());
    });
}

public static void SetText(string text)
{
    _dlg.BeginInvoke(new MethodInvoker(delegate { dlg.SetText(text); }));
}

这样Form1将在另一个线程中模态化(具有自己的消息泵),并且您的调用 PowerShell 线程不会停止。它们之间仍然可以通过消息调度进行通信(Invoke()/BeginInvoke()).

请注意SetText()现在是异步的,要使其同步,只需替换BeginInvoke() with Invoke().

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

Powershell:无法与 .Net 程序集中存储的表单交互 的相关文章

随机推荐

  • 隐藏 SSRS 中的列

    我正在使用 SSRS 2012 和 Excel 2010 我想在导出到 Excel 时隐藏一列 在浏览了一些论坛后 似乎最好的方法是转到您正在查找的内容的列或文本框隐藏并在 可见性 隐藏 选项下将 表达式 设置为 IIF Globals R
  • Chicken计划中的命名空间

    命名空间在 Chicken Scheme 中如何工作 我现在正在使用parley鸡蛋 当我定义一个名为例如的函数时read 由于名称冲突而导致错误 实际上 因为我的read覆盖parley s own read 并且以错误的类型调用它 这是
  • 使用 URL swift Alamofire 上传视频

    我需要使用 alamofire 将视频上传到服务器 用户选择视频 我在 didFinishPickingMediaWithInfo 中成功获取 URL 如下所示 func imagePickerController picker UIIma
  • 如何导入无法识别的日期时间格式的 CSV?

    该表如下所示 CREATE TABLE dbo temptable id nvarchar 50 COLLATE SQL Latin1 General CP1 CI AS NOT NULL datetime datetime NOT NUL
  • 合并 PDF 文件

    是否可以使用 Python 合并单独的 PDF 文件 假设是这样 我需要进一步扩展一下 我希望循环遍历目录中的文件夹并重复此过程 我可能会碰碰运气 但是否有可能排除每个 PDF 中包含的页面 我的报告生成总是会创建一个额外的空白页面 您可以
  • 使用 Scala 和 SBT 设置 IntelliJ

    我正在尝试使用 scala 和 sbt 设置 intellij 进行开发 我已经在 IDE 上安装了 scala 和 SBT 插件 但是 当我尝试创建新的 scala 和 sbt 项目时 build sbt 文件显示以下错误 Cannot
  • Jmeter:使用带变量的 jmeter Junit 请求

    正如我在问题中所说 是否可以将 jmeter 变量 通过 J 传递 传递到JUnit Request为了它可以在 junit 测试内部使用 听起来可行Apache Junit 请求文档 http jmeter apache org user
  • Android 填充Webview内容时底部白色条纹

    将 HTML 加载到 Web 视图后 我会在布局的右侧和底部看到一条白色条纹 对于正确的 我使用以下方法解决了它 setScrollBarStyle WebView SCROLLBARS INSIDE OVERLAY 然而 我尝试了很多方法
  • 如何使用 dplyr::filter() 仅返回值包含一个或多个给定字符串向量的行?

    我有一个包含一列字符串的数据框 我想使用 filter 或另一个可管道函数 仅返回包含字符串的行 这些字符串包含另一个字符串向量中的任何值 我已经查看了以前的问题和答案 但找不到任何我正在寻找的东西 例如 title lt c apple
  • .Net WebClient 类中的curl -u 等效项

    这个问题解释了一切 但这里有更多信息 我正在尝试将 4sq api 与 C 一起使用 并且需要在每个请求中发送用户名密码对 API 文档说 curl u user pass 可以完成这项工作 但我如何使用 WebClient 来完成这项工作
  • 将 Web 服务器升级到 .net Framework 4.6.1 时,与远程 SQL 服务器的连接中断

    我们目前正在努力将我们的 asp net Web 应用程序 托管在 IIS 7 5 上 从 net Framework v4 5 更新到 v4 6 1 在 SQL Server 与 IIS 运行在同一机器上的小型较低环境 本地开发中 此更新
  • 为 SQL Compact 4 设置 EF4 数据源

    我已经使用 vs 工具安装了 Visual Studio 2010 SP1 EF 4 1 SQL Compact 4 0 一切看起来都很好 除了我无法通过向导使用 SQL Compact 4 作为实体框架的数据源 唯一的替代方案是 SQL
  • 并发修改异常? [复制]

    这个问题在这里已经有答案了 我试图按开始时间对时间跨度列表 表示为具有开始时间和结束时间的 Time 数组 进行排序 我正在尝试使用以下嵌套循环来执行此操作 for Time span workingList Time compareTo
  • 配置 cobertura 以忽略某些代码块

    是否可以使用 Cobertura 告诉它忽略由开始和结束注释标识的某些代码位 例如 public class Foo public void static doSomething Cobertura Ignore Start Cobertu
  • 0x80020101代表什么?

    一个简单的问题 我在微软的错误查找或轻松使用谷歌中找不到答案 HRESULT 0x80020101 代表什么 http support microsoft com kb 247784 http support microsoft com k
  • 从scala并行收集到常规收集的转换

    我正在尝试从并行集合转换回常规地图 根据 api 如果我在任何适当定义的并行集合上调用 toMap 它应该返回一个标准 Map 但它会通过可迭代的扁平集合返回 ParMap I have a val task Stream Future I
  • 在哪里存储密码?

    我正在编写一个 Android 密码管理器应用程序 我想将主密码存储在某个地方 但我不知道在哪里 我是否应该使用我选择的硬编码密码对用户提供的主密码进行加密 然后将其存储到数据库中 或者我应该做点别的什么 您永远不应该存储未加密的密码 对于
  • 默认加载哪些 ruby​​ 模块?

    直到最近 我还认为所有标准模块 那些可以在http ruby doc org stdlib http ruby doc org stdlib 默认情况下不加载 也就是说 您必须要求您将要使用的每一个 但从内容来看 确实有一些是被加载的 LO
  • 删除网格视图选项

    如何删除 显示分组依据框 和 删除此列 GridView菜单 当我去参加活动时 没有 ShowGridMenu 事件 所以对我不起作用 Use the GridView PopupMenuShowing http documentation
  • Powershell:无法与 .Net 程序集中存储的表单交互

    我只是想学习这个东西 并且将来想在我的一个项目中使用它 我有一个带有简单文本框的小表单 存储在 Net dll C 中 这是我在这个 dll 中的类 其中包含与此表单交互的方法 using System using System Colle