.NET远程处理异常:权限被拒绝:无法远程调用非公共或静态方法

Vil*_*lx- 4 .net c# remoting exception

我正在编写一个程序,它允许加载特定的托管.DLL文件并使用它.由于我希望能够卸载.DLL文件,我正在创建两个AppDomain - 一个用于app本身,另一个用于当前加载的.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));

    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试这样做时,我得到了例外:

var c = SomeInstanceOfRemoteObjectWrapper.InvokeMethod<RemoteObjectWrapper>("somePublicMethod", "some string parameter");
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?据我所知,该InvokeMethod方法甚至没有执行,当我尝试运行它时抛出异常.

补充:澄清 - SomeInstanceOfRemoteObjectWrapper在.DLL的AppDomain中构建,然后返回到我的主AppDomain,InvokeMethod<T>()从我的主AppDomain调用(我希望它在.DLL的AppDomain中执行).

Jar*_*Par 5

即使该方法InvokeMethod<T>是公开的,它也包含在内部类中.C#中没有修饰符使其成为内部修饰符.因此,InvokeMethod<T>内部的有效可见性,您将获得例外.使RemoteObjectWrapper公众应该解决这个问题.