gpt4 book ai didi

c# - 创建的 AppDomain 上的 AssemblyResolve 事件出现问题

转载 作者:太空宇宙 更新时间:2023-11-03 11:47:02 25 4
gpt4 key购买 nike

我试图通过将 AppDomain 及其 AssemblyResolve 事件包装在一个类中来自定义程序集解析过程。我的 ClassLoader 的简化版本如下。我遇到的问题是,当事件 AssemblyResolve 被触发时,我似乎得到了 ClassLoader 的一个新实例,而不是我之前创建的实例。

[Serializable]
public class ClassLoader // : IDisposable
{
public AppDomain Domain { get; private set; }
public string FooProperty { get; set; }

public ClassLoader(string domain) {
Domain = AppDomain.CreateDomain(domain);
Domain.AssemblyResolve += Domain_AssemblyResolve;
}

private Assembly Domain_AssemblyResolve(object sender, ResolveEventArgs args)
{
Console.WriteLine(
"ClassLoader HashCode: {0} FooProperty: {1}\n\n",
GetHashCode(),
FooProperty);
// ...
return null;
}
// ...
}

执行此代码时,FooProperty 未在 Domain_AssemblyResolve 事件处理程序中初始化,并且 ClassLoader 实例具有与“c”不同的哈希码。

 var c = new ClassLoader("demo");
c.FooProperty = "Foo";
Console.WriteLine(
"c Hash Code: {0} FooProperty: {1}",
c.GetHashCode(),
c.FooProperty);
c.Domain.CreateInstanceAndUnwrap("Not important", "Not important");

你知道发生了什么吗?或者一些解决方法?

谢谢!

最佳答案

ClassLoader 实例 c 是在应用程序域 A 上创建的,因为它不继承自 MarshalByRefObject 它将序列化到您在将事件处理程序添加到 AssemblyResolve 时创建的应用程序域中。发生这种情况是因为该方法是一个实例方法,委托(delegate)将需要对调用该方法的目标对象的引用。

如果您只是希望 FooProperty 在触发事件处理程序时具有特定值,那么您可以仅在初始化属性后添加事件处理程序,从而导致值被序列化并在新的创建应用程序域。

public string FooProperty { get; private set; }

public ClassLoader(string domain, string fooProperty)
{
FooProperty = fooProperty; // Set it before adding event handler
Domain = AppDomain.CreateDomain(domain);
Domain.AssemblyResolve += Domain_AssemblyResolve;
}

如果您要求实例 c 在两个应用程序域中都可用,那么您应该看看:

Making Objects Remotable

Events and Delegates with .NET Framework Remoting

关于c# - 创建的 AppDomain 上的 AssemblyResolve 事件出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3148316/

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