Я пишу программу, которая позволит загружать определенный управляемый файл .DLL и играть с ним. Поскольку я хочу выгрузить файл .DLL, я создаю два домена приложений - один для самого приложения, другой для загруженного в данный момент .DLL.
Поскольку большинство объектов в загруженном .DLL не сериализуются должным образом, я создаю класс-оболочку MarshalByRefObject
, который будет хранить сам объект в своем собственном AppDomain и предоставлять некоторые функции отражения для основного AppDomain приложения.
Однако, когда я пытаюсь вызвать метод на удаленном объекте, я застреваю с исключением:
В доступе отказано: невозможно удаленно вызывать непубличные или статические методы.
Это очень странно, потому что я вообще не использую никакие непубличные или статические методы. По сути, то, что у меня есть:
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
даже не выполняется, возникает исключение, когда я пытаюсь его запустить.
Добавлено: Для пояснения - в домене приложений .DLL создается SomeInstanceOfRemoteObjectWrapper
, а затем возвращается в мой основной домен приложений. InvokeMethod<T>()
вызывается из моего основного домена приложений (и я ожидаю, что он будет выполнен домен приложений .DLL).