특정 관리되는 .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의 응용 프로그램 도메인에서 실행 할 것으로 예상)된다.
스택 추적, 호출 코드 및 원격 객체 코드를 보는 것이 유용 할 수 있지만 somePublicMethod가 정적 일 수있는 것처럼 들립니다. – pdr
@pdr - 아니요, 실행은 절대'InvokeMethod'에 전달되지 않습니다. 예외는 위의 행에서 정확히 throw되며 스택 추적에서도이를 증명합니다. 다른 유용한 정보는 없기 때문에 여기에 게시하지 않겠지 만 예외가 발생하는 코드 줄은이 것이고 내부 예외 또는 기타 내용은 없습니다. –