gpt4 book ai didi

c# - 我可以从另一个 AppDomain 实例化一个类型为 'dynamic' 吗?

转载 作者:可可西里 更新时间:2023-11-01 08:28:15 27 4
gpt4 key购买 nike

我正在尝试从不同的程序集(在构建时未知)加载一个类型作为“动态”并在该类型上执行一个方法。我的目标是完全断开“插件”与父应用程序的连接,这样就不需要任何共享代码或通用接口(interface)类型。该接口(interface)通过加载类型上的预期方法签名来隐含。

这个有效:

dynamic myObj = Assembly.Load("MyAssembly").CreateInstance("MyType");
myObj.Execute();

但是,这会将类型连同其所有依赖程序集加载到当前 AppDomain 中。我想修改它以允许我在单独的 AppDomain 中执行相同的操作。

这有效但没有使用 dynamic 关键字,我需要知道我正在实例化的显式类型才能调用 Execute 方法:

var appDomain = AppDomain.CreateDomain(domainName, evidence, setup);
var myObj = appDomain.CreateInstanceAndUnwrap(assembly, type);
typeof(IMyInterface).InvokeMember("Execute", BindingFlags.InvokeMethod, null, myObj);

这基本上是我的目标案例,我一直在努力让这样的东西起作用:

dynamic myObj = ad.CreateInstanceAndUnwrap(assembly, type);
myObj.Execute();

我一直以 RuntimeBinderException 结束,消息为“‘System.MarshalByRefObject’不包含‘Execute’的定义”。这条消息是有道理的,确保它不包含“执行”的定义,但我知道我正在实例化的类型确实包含“执行”方法。我想这里有一些透明代理正在发生的事情阻止了它的工作,但我不确定是什么。

我尝试实例化的实际类如下所示:

[Serializable]
public class MyClass : MarshalByRefObject {
public void Execute() {
// do something
}
}

我也尝试过使用共享界面(不是我的主要目标,但我想先弄清楚)所以它看起来像:

[Serializable]
public class MyClass : MarshalByRefObject, IPlugin {
public void Execute() {
// do something
}
}

其中 IPlugin 是父应用程序中的已知类型,并且该插件在构建时具有适当的引用,但这似乎也不起作用。

我猜测此时无法跨 AppDomain 边界加载动态类型。

有没有办法让它真正发挥作用?

最佳答案

作为leppie indicated ,你必须实现 IDynamicMetaObjectProvider interface包装返回给您的代理,然后您可以对 that 使用 dynamic 调用。

在您的实现中,您希望采用包装代理并将所有调用转发到静态 ExecuteMessage methodRemotingServices class 上,它将带走你的代理,以及一个 IMethodCallMessage interface实现。

请注意,实现IMethodCallMessage 接口(interface)并非易事。此外,您必须正确解释 IMethodReturnMessage interface实现正确获取返回值、refout 参数(如果有的话)。

也就是说,提供一个一个供客户端和服务器假定的接口(interface)的程序集通常是一个更好的主意;如果在服务器端以任何方式更改方法,即使客户端使用dynamic,您仍然必须更改调用站点以适应更改。至少通过接口(interface),您可以一些类型的编译时检查,这总是比运行时错误更受欢迎。

关于c# - 我可以从另一个 AppDomain 实例化一个类型为 'dynamic' 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11213922/

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