gpt4 book ai didi

c# - 如何将不可序列化的对象作为参数发送给代理方法。 MarshalByRefObject 包装器?

转载 作者:行者123 更新时间:2023-11-30 16:23:47 31 4
gpt4 key购买 nike

我目前正在修改一个插件架构,以便它利用 AppDomains。我的插件与我在网上找到的许多示例之间的主要区别在于,我的主应用程序不是运行插件并将其结果发送回主应用程序,而是向插件发送信息的应用程序。

按照目前的情况,我在单独的 AppDomain 中创建了一个加载程序实例。然后它会执行所有正常的初始化,例如加载插件程序集。为此,我然后使用加载程序的代理来调用将数据从主应用程序发送到新 AppDomain 的方法。

当我试图调用一个参数类型不可序列化且不是从 MarshalByRefObject 派生的方法时,我的问题就出现了。

由于这些类型来自第 3 方代码,并且插件期望接收它们,所以我似乎无法找到执行此操作的方法。在找到这个问题(How to solve "Must be MarshalByRefObject" in a good but multiple-inheritance amputated language like C#?)之后,我正在考虑创建某种包装器。我的缺点是我无法在不修改第 3 方代码的情况下找到一种方法。

这是我的问题的一个例子:

// Cant modify this class
class ThirdPartyClass
{
// The properties are also 3rd party and nonserializable. These are accessed by the plugins.
public AnotherClass Property1{ get; set; }
public AnotherClass Property2{ get; set; }

public ThirdPartyClass(){}
}

class Loader : MarshalByRefObject
{
private Plugin plugin;

public Loader()
{
Assembly pluginAssembly = Assembly.LoadFrom("Full/Assembly/Path");
plugin = pluginAssembly.CreateInstance("Full.Plugin.Name") as Plugin;
}

public void DoSomething(ThirdPartyClass o)
{
...
plugin.DoSomethingElse(o);
}
}

class PluginManager
{
void Main(ThirdPartyClass o)
{
AppDomain pluginAppDomain = AppDomain.CreateDomain("Plugin AppDomain");
Loader loader = pluginAppDomain.CreateInstanceFromAndUnwrap("Full/Loader/Path", "Full.Loader.Name") as Loader;

// This is where I would have a problem.
loader.DoSomething(o);
}
}

如有任何帮助,我们将不胜感激。

最佳答案

如果这些只是跨越应用域边界的实例,这意味着您不会在多个应用域中使用它们,您可以简单地将它们包装在派生自 MarshalByRefObject 的持有者类中。

我在 IronScheme 的远程处理代码中使用了类似的方法。

问题是当您实际上需要做的不仅仅是保留实例。在这种情况下,您可能可以使用接口(interface)来 Hook 所需的方法并通过“holder”类公开它。

关于c# - 如何将不可序列化的对象作为参数发送给代理方法。 MarshalByRefObject 包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11249796/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com