2010-03-23 5 views
3

특정 관리되는 .DLL 파일을로드하고 함께 재생할 수있는 프로그램을 작성하고 있습니다. 이후 .DLL 파일을 언로드 할 수있는 기능을 원한다면 두 개의 AppDomains를 만듭니다. 하나는 응용 프로그램 용이고 다른 하나는 현재로드 된 .DLL 용입니다..NET 원격 예외 : 권한이 거부되었습니다. public이 아닌 메서드 나 정적 메서드를 원격으로 호출 할 수 없습니다.

로드 된 .DLL의 대부분의 객체가 제대로 직렬화되지 않으므로 객체 자체를 자체 AppDomain에 유지하고 기본 반영 AppDomain에 일부 리플렉션 기능을 노출하는 MarshalByRefObject 래퍼 클래스를 만듭니다. 나는 원격 객체의 메소드를 호출 할 때

그러나 나는 예외가 박히 :

권한이 거부 : 원격 비공개 또는 정적 메서드를 호출 할 수 없습니다.

비공개 또는 정적 메서드를 전혀 사용하지 않기 때문에 매우 이상합니다. 본질적으로, 내가 가진 무엇 :

class RemoteObjectWrapper: MarshalByRefObject 
{ 
    private Type SourceType; 
    private object Source; 

    public RemoteObjectWrapper(object source) 
    { 
     if (source == null) 
      throw new ArgumentNullException("source"); 
     this.Source = source; 
     this.SourceType = source.GetType(); 
    } 
    public T WrapValue<T>(object value) 
    { 
     if (value == null) 
      return default(T); 
     var TType = typeof(T); 
     if (TType == typeof(RemoteObjectWrapper)) 
      value = new RemoteObjectWrapper(value); 
     return (T)value; 
    } 
    public T InvokeMethod<T>(string methodName, params object[] args) 
    { 
     return WrapValue<T>(SourceType.InvokeMember(methodName, 
      System.Reflection.BindingFlags.FlattenHierarchy | System.Reflection.BindingFlags.Instance | 
      System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Public, null, this.Source, args)); 

    } 
} 

그리고 내가하려고 할 때 예외를 얻을 :

var c = SomeInstanceOfRemoteObjectWrapper.InvokeMethod<RemoteObjectWrapper>("somePublicMethod", "some string parameter"); 

여기 무슨 일이야? 내가 이해할 수있는 한, InvokeMethod 메소드가 실행되지도 않는다. 실행하려고하면 예외가 발생한다.

추가 : 명확히하기 - SomeInstanceOfRemoteObjectWrapper가 .DLL의 응용 프로그램 도메인으로 구성하고 내 주요 응용 프로그램 도메인에 리턴됩니다 InvokeMethod<T>()은 내 주요 응용 프로그램 도메인에서 호출 (그리고 나는 그것이 .DLL의 응용 프로그램 도메인에서 실행 할 것으로 예상)된다.

+1

스택 추적, 호출 코드 및 원격 객체 코드를 보는 것이 유용 할 수 있지만 somePublicMethod가 정적 일 수있는 것처럼 들립니다. – pdr

+0

@pdr - 아니요, 실행은 절대'InvokeMethod'에 전달되지 않습니다. 예외는 위의 행에서 정확히 throw되며 스택 추적에서도이를 증명합니다. 다른 유용한 정보는 없기 때문에 여기에 게시하지 않겠지 만 예외가 발생하는 코드 줄은이 것이고 내부 예외 또는 기타 내용은 없습니다. –

답변

5

심지어 방법 InvokeMethod<T>은 공개되어 내부 클래스에 포함됩니다. C#의 수식어는 내부적으로 사용하지 않습니다. 따라서 InvokeMethod<T>의 효과적인 가시성은 내부적이며 예외가 발생합니다. RemoteObjectWrapper 공개로 설정하면이 문제를 해결할 수 있습니다.

+0

이상한 ...이 작품 ...하지만 왜 다른 비슷한 수업을 필요로하지?이것은 그것을 필요로하는 유일한 원격 객체 래퍼 클래스입니다. (저는 특정 객체를 감싸는 몇가지 다른 것들이 영향을받지 않습니다) –

2

나는 똑같은 문제가 있습니다.

class MyClass : MarshalByRefObject 
{ 
    public T Foo<T>() where T : MarshalByRefObject { 
    // stuff 
    } 
} 

통화 만 한 당신의 MyClass의 객체가 원격 아니므로 내부 형 T 작업 벌금 MyClass.Foo하지만하기 : 당신과 같은 경우 객체입니다. 나는 당신이 전화를 걸고있는 장소가 T에 접근 할 수 있다고 가정 할 수 없기 때문에 이것이라고 생각합니다. 그러나 공개적으로 사용하는 유형을 만들 수없는 경우에는 매우 어색합니다. 모두의 안전 입력되지

class MyClass : MarshalByRefObject 
{ 
    public object Foo(Type t) { 
    // stuff 
    } 
} 

및 발신자의 측에 캐스트가 필요합니다 당신은 가끔 포장 또는 함께 푸 교체하여 주위를 얻을 수 있습니다. 더 나은 솔루션이 있는지 모르겠지만 내부 유형을 공개하지 않으려는 경우

관련 문제