gpt4 book ai didi

.net - 如何在两个 .NET AppDomain 之间传递未知类型?

转载 作者:行者123 更新时间:2023-12-02 14:42:08 24 4
gpt4 key购买 nike

我有一个 .NET 应用程序,其中单独 AppDomain 中的程序集必须共享按值传递的序列化对象。

两个程序集都引用一个共享程序集,该程序集定义服务器类的基类,并定义将在域之间传递的实体类型的基类:

public abstract class ServerBase : MarshalByRefObject
{
public abstract EntityBase GetEntity();
}

[Serializable]
public abstract class EntityBase
{
}

服务器程序集定义了服务器类和实体类型的具体实现:

public class Server : ServerBase
{
public override EntityBase GetEntity()
{
return new EntityItem();
}
}

[Serializable]
public class EntityItem : EntityBase
{
}

客户端程序集创建将托管服务器程序集的AppDomain,并使用服务器类的实例来请求实体类型的具体实例:

class Program
{
static void Main()
{
var domain = AppDomain.CreateDomain("Server");

var server = (ServerBase)Activator.CreateInstanceFrom(
domain,
@"..\..\..\Server\bin\Debug\Server.dll",
"Server.Server").Unwrap();

var entity = server.GetEntity();
}
}

不幸的是,这种方法会失败并出现 SerializationException,因为客户端程序集不直接了解所返回的具体类型。

我已了解到 .NET 远程处理在使用二进制序列化时支持未知类型,但我不确定这是否适用于我的设置或如何配置它。

或者,考虑到客户端只需要通过其已知的基类接口(interface)访问它,是否有其他方法将未知的具体类型从服务器传递到客户端。

感谢您的建议,

蒂姆

编辑:

根据 Hans 的要求,这里是异常消息和堆栈跟踪。

SerializationException
Type is not resolved for member 'Server.EntityItem,Server, Version=1.0.0.0,Culture=neutral, PublicKeyToken=null'.

at Interop.ServerBase.GetEntity()
at Client.Program.Main() in C:\Users\Tim\Visual Studio .Net\Solutions\MEF Testbed\Client\Program.cs:line 12
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

最佳答案

这会失败,因为 CLR 根本不可能找到该程序集,您将其放在了无法找到的位置。通过添加对程序集的引用并将其 Copy Local 属性设置为 True 以便将 server.dll 复制到构建目录中,可以简单地解决此问题。如果您想将其保留在原来的位置,那么您必须实现 AppDomain.AssemblyResolve 来帮助 CLR 找到它。

关于.net - 如何在两个 .NET AppDomain 之间传递未知类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4185816/

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