将一个对象传递给默认 AppDomain,以从进程内创建的子 AppDomain 接收回调

2024-03-28

地点:

  1. 我正在从我的进程创建一个子应用程序域来加载程序集。
  2. 我能够调用此 AppDomain。
  3. 我想将一个对象从我的默认进程 AppDomain 传递到这个新创建的 AppDomain,以接收从新 AppDomain 中加载的程序集到我的默认 AppDomain 的回调。

我发现的一种方法是使用 AppDomain.DoCallback 方法,但不确定如何在我的子 AppDomain 中获取我的主机 AppDomain?

任何机构有任何想法来实现它吗?


总体思路是将派生自的类的实例传递给新创建的域MarshalByRefObject班级。它将保证该对象将通过引用而不是通过值进行封送。这意味着代理将被传递到新域而不是原始对象(该代理将由 .NET 框架为您生成)。

稍后,当您在此代理上调用方法时,此调用将被传递回原始域(创建对象的域)。换句话说,方法将在原始域中执行。

下面的代码展示了这个想法:

public class Program
{
    private static void Main(string[] args)
    {
        var listener = new Listener();
        var otherDomain = AppDomain.CreateDomain("otherDomain");

        var instance = (Loader)otherDomain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(Loader).FullName);
        instance.Init(listener);
    }
}

[Serializable]
public class Loader 
    : MarshalByRefObject
{
    public void Init(Listener listener)
    {
        Console.WriteLine($"[{nameof(Init)}] Hello from {AppDomain.CurrentDomain.FriendlyName} domain");
        listener.Callback();
    }
}

[Serializable]
public class Listener 
    : MarshalByRefObject
{
    public void Callback()
    {
        Console.WriteLine($"[{nameof(Callback)}] Hello from {AppDomain.CurrentDomain.FriendlyName} domain");
    }
}

当您运行此代码时,您将得到以下结果:

[Init] Hello from otherDomain domain
[Callback] Hello from Sandbox.vshost.exe domain

它表明 Init 方法是在新域中执行的,但回调是在原始域中执行的。现在注释 2 行: MarshalByRefObject并再次运行该程序。这次Listener将按值传递到新域,结果将是:

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

将一个对象传递给默认 AppDomain,以从进程内创建的子 AppDomain 接收回调 的相关文章

随机推荐

  • Oracle SQl Dev,如何计算2个日期之间的工作日数

    有谁知道如何计算两个日期字段之间的工作日数 我正在使用 oracle sql 开发人员 我需要找到多个开始日期和结束日期之间工作日的平均值 因此 我需要获取每条记录的天数 以便对它们进行平均 这是可以作为一行完成的事情吗 SELECT我的查
  • 将“Future[Option[Future[Option[X]]]]”转换为“Future[Option[X]]”

    如何转型Future Option Future Option X into Future Option X 如果它是一个TraversableOnce代替Option我会用未来的伴生对象 http www scala lang org a
  • Console.ReadKey 取消[重复]

    这个问题在这里已经有答案了 可能的重复 如何向 Console ReadLine 添加超时 https stackoverflow com questions 57615 how to add a timeout to console re
  • 在 Visual Studio 中编译为独立可执行文件 (.exe)

    如何在 Visual Studio 中制作独立的 exe 它只是一个简单的控制台应用程序 我认为用户不会喜欢安装一个微小的控制台应用程序 我使用 Visual Studio 命令提示符编译了一个简单的 cpp 文件 即使未安装 NET Fr
  • 在 DataTrigger 内绑定 Storyboard 动画会导致 XamlParser 崩溃

    我希望我的应用程序在每次发生特定事件时将椭圆动画到新位置 出于测试目的 我制作了一个更改视图模型属性的按钮 并且该属性绑定到触发动画的数据触发器 但后来我希望视图模型根据我尚未实现的其他事件触发它 这就是为什么我可以不要直接在视图中使用绑定
  • 如何在 Windows 上设置 git 存储库,然后在 Mac OSX 上对其进行推送/拉取

    我正在尝试设置一个基于 Windows 的 Web 服务器 但在 Mac OSX 上进行开发工作 我在 Windows 服务器上安装了 freeSSHd 和 msysGit 并在我想要的位置设置了一个存储库 我的 Mac 上也有 git 并
  • 使用 XCTest 进行异步性能测试

    我已经开始探索用于异步和性能测试的新 XCTest API 单独来看 WWMC 中的 Apple 示例运行良好 但我一直无法弄清楚如何将它们结合起来 我能想到的最好的方法如下 但运行时收到以下错误 API 违规 在未设置任何期望的情况下调用
  • 有没有办法从 applet 本身重新加载/刷新 java applet?

    我的小程序上有一个按钮 包含在浏览器中 我想通过以下两种方式之一重新加载或刷新整个小程序 刷新小程序本身 无需刷新浏览器 刷新整个浏览器 这可以在小程序内实现吗 使用 AppletContext showDocument 方法 applet
  • HTML5 视频无法在 Chrome 中加载,但在打开开发者控制台时可以工作

    我正在为客户开发一个网络应用程序 HTML5 视频标签存在问题 问题是该视频无法在 Chrome 中加载 但可以在 Safari Firefox 和 IE 上加载 所以我开始在 Chrome 中调试 但我发现如果我在打开控制台的情况下刷新页
  • C++ 中默认的 catch throw 语句按值传递还是按引用传递

    默认的catch语句是如何实现的catch 通过值或引用捕获异常 其次 默认怎么抛出throw 抛出异常 按值还是按引用 包罗万象的捕获物 根本不允许您访问异常对象 因此这个问题没有实际意义 更正 重新投掷throw 抛出原始对象 如果处理
  • Errno::ENOMEM:无法分配内存 - cat

    我有一项在生产环境中运行的作业 用于处理 xml 文件 xml 文件总共约为 4k 大小为 8 到 9 GB 处理后我们得到 CSV 文件作为输出 我有一个 cat 命令 它将所有 CSV 文件合并到我得到的单个文件中 Errno ENOM
  • “Greedy” 和 “Reluctant” 正则表达式量词有什么区别?

    来自Pattern http java sun com javase 6 docs api java util regex Pattern htmljava文档 Greedy quantifiers X X once or not at a
  • 如何通过 YouTube API 检索我自己的私人播放列表?

    我正在尝试找到一种方法从 YouTube 检索我自己的私人播放列表 以便在我自己的个人网站上显示 到目前为止 所有文档似乎都表明检索私人用户数据 如私人播放列表 需要您的网站users通过身份验证过程以提供他们自己的验证 就我而言 我不想要
  • 使用 Dlang 计算目录中的文件数

    我想要一种简单的方法来使用 D 来计算目录中的文件数量 据我从 D 手册中可以看出 dirEntries 返回一个范围 但它没有长度属性 因此 我必须用计数器迭代结果 或者收集传统数组中的名称 我可以找到它的长度 有更好的方法吗 auto
  • 单元测试 OSGi 组件

    我目前正在考虑 如何设计 OSGi 组件 以便使用 jUnit 和 Mockito 等框架轻松为其编写测试 由于 OSGi 增强了 DIP 因此模拟捆绑包间的依赖关系非常容易 依赖倒置原理 和注入器方法 例如 setter 通常存在 但是捆
  • 使用以下格式转换日期时间字符串:(yyyy-MM-dd'T'hh:mm:ss-zzz)

    我收到一个 JSON 字符串 其中包含如下所示的日期 2015 07 09T08 38 49 07 00最后一部分是时区 有没有一种标准方法可以将其转换为DateTimeOffset 这是我到目前为止所拥有的 var olu JsonCon
  • 如何在 OpenCart 中创建自定义的 SEO 友好 URL?

    如何在 OpenCart 中自定义系统 URL 例如 我想http example com index php route checkout cart http example com index php route checkout ca
  • AngularJs ng-repeat 带索引

    我想仅在单击显示按钮时在此部分中显示名称 我正在尝试使用索引进行检测 但没有成功 Code div a vm updateText a div class updateSection div div
  • AWS Lambda SQS 触发器在队列重新创建后未触发

    我一直在使用 terraform 定义一些 SNS 主题 然后使用 SQS 队列来订阅它们 然后这些队列具有由 SQS 触发的 lambda 并从这些队列中获取消息 Terraform 处理 SNS 主题 SQS 队列的创建以及允许 SNS
  • 将一个对象传递给默认 AppDomain,以从进程内创建的子 AppDomain 接收回调

    地点 我正在从我的进程创建一个子应用程序域来加载程序集 我能够调用此 AppDomain 我想将一个对象从我的默认进程 AppDomain 传递到这个新创建的 AppDomain 以接收从新 AppDomain 中加载的程序集到我的默认 A