2010-06-30 2 views
2

AppDomain 및 해당 AssemblyResolve 이벤트를 클래스 안에 래핑하여 어셈블리 확인 프로세스를 사용자 지정하려고합니다. 내 ClassLoader의 단순화 된 버전은 아래와 같습니다. 내가 가지고있는 문제는 이벤트 AssemblyResolve이 해고 될 때 이전에 만든 하나가 아닌 ClassLoader의 새 인스턴스를 얻는 것 같습니다. 생성 된 AppDomain의 AssemblyResolve 이벤트 관련 문제

[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"); 

어떤 일이 일어나고 있습니까? 또는 몇 가지 해결 방법?

감사합니다.

답변

2

ClassLoader 예를 c는 응용 프로그램 도메인 A에 생성되며이 MarshalByRefObject에서 상속하지 않기 때문에 그것은 당신이 AssemblyResolve에 이벤트 처리기를 추가 순간에 작성중인 응용 프로그램 도메인에 연재됩니다. 이것은 메서드가 인스턴스 메서드이고 대리자가 메서드가 호출되는 대상 개체에 대한 참조를 필요로하기 때문에 발생합니다.

이벤트 처리기가 트리거 될 때 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

0

음,

이 코드를 실행, FooProperty 는 Domain_AssemblyResolve 이벤트 핸들러 내부 Foo을 초기화한다 코드이있을 것 같지 않습니다

에서 초기화되지 않습니다.

ClassLoader 인스턴스에는 "c"와 다른 해시 코드 이 있습니다. 모든 (객체의 주소를 기반으로) 서로 다른 해시 코드가됩니다 개체 (같은 ClassLoader)에서 상속 귀하의 경우처럼 GetHashCode()을 다시 구현하지 않는 클래스의

인스턴스. 내부 상태에 따라 일관된 코드를 원하면 GetHashCode()을 재정의하십시오.

관련 문제