1

我的问题非常相似,如果不是这个的复制品的话。令人恼火的是,“答案”并没有给我很多工作,坦率地说,我处于一个松散的结局。

问题应该是相当明显的。我想在可插入应用程序框架的进程之间传递 WPF 元素,而不必使用托管插件框架。我部署到一个环境,由于高度限制性的权限,将文件缓存到我无法控制的磁盘是不可接受的。这些是解决方法 - 将插件根放在 appdata 中 - 但强制执行的目录结构是不可取的,据我所知,这不是该文件夹的用途。

异常方法如下,异常行以粗体突出显示:

委托无效 AddUIElementDelegate(客户端客户端,System.AddIn.Contract.INativeHandleContract 句柄);
        private void AddUIElement(客户端客户端,System.AddIn.Contract.INativeHandleContract 句柄)
        {
            if (this.Dispatcher.CheckAccess())
            {
                var element = System.AddIn.Pipeline.FrameworkElementAdapters.ContractToViewAdapter(handle);
                m_UIElements[客户端] = 元素;
                StackPanel_PluginUIHost.Children.Add(m_UIElements[client]);
            }
            别的
            {
                this.Dispatcher.BeginInvoke(new AddUIElementDelegate(AddUIElement), 客户端, 句柄);
            }
        }

实验似乎需要通过STA 线程上的FrameworkElementAdapters.ContractToViewAdapter()解组句柄 ,因此需要调用。需要注意的是,client是一个回调MarshalByRefObject,在这个方法中是通过代理访问的。句柄也是通过调用FrameworkElementAdapters.ViewToContractAdapter()远程创建的,并作为远程方法的返回值传递到此应用程序域。

我收到的异常是发生了 RemotingException - 权限被拒绝:无法远程调用非公共或静态方法。

欢迎任何反馈。

4

1 回答 1

-1

您收到的消息包括您正在调用不可见方法的可能性。检查另一个程序集的私有信息(……听起来不对)不是“类型安全”操作,执行非类型安全操作需要您的程序集具有 CLR 可以给予的最高信任:SkipVerification。CLR 不仅不会验证正常“沙盒”任务的权限,它还会让你的代码在无人监督的情况下离开沙盒,如果操作系统警察因为你违反规则而将你关闭,那是你的问题。由于您提到代码在高度限制的权限空间中执行,我怀疑这是一个选项。

也许您应该查看 Dispatcher.CheckAccess() 正在执行的检查。听起来你从它那里得到了一个关于你使用回调委托的能力的误报。

于 2010-09-29T15:15:39.907 回答