1

私の質問は、これのレプリカではないにしても、非常に似ています。腹立たしいことに、「答え」は私に多くの仕事を与えてくれず、率直に言って、私は途方にくれています。

問題はかなり明白なはずです。Managed AddIn Framework を使用せずに、プラグ可能なアプリケーション フレームワークのプロセス間で WPF 要素を渡したいと考えています。アクセス許可が非常に制限されているため、ファイルをディスクにキャッシュして制御できない環境にデプロイします。アドイン ルートを appdata に配置するという回避策がありますが、強制されたディレクトリ構造は望ましくなく、私が知る限り、それはそのフォルダの目的ではありません。

除外方法は次のとおりです。除外行は太字で強調表示されています。

デリゲート void AddUIElementDelegate(クライアント クライアント、System.AddIn.Contract.INativeHandleContract ハンドル);
        private void AddUIElement(クライアント クライアント、System.AddIn.Contract.INativeHandleContract ハンドル)
        {
            if (this.Dispatcher.CheckAccess())
            {
                var element = System.AddIn.Pipeline.FrameworkElementAdapters.ContractToViewAdapter(ハンドル);
                m_UIElements[クライアント] = 要素;
                StackPanel_PluginUIHost.Children.Add(m_UIElements[クライアント]);
            }
            そうしないと
            {
                this.Dispatcher.BeginInvoke(新しい AddUIElementDelegate(AddUIElement), クライアント, ハンドル);
            }
        }

実験では、STA スレッドでFrameworkElementAdapters.ContractToViewAdapter()を介してハンドルをアンマーシャリングする必要があるように思われた ため、呼び出しが行われました。clientはコールバックMarshalByRefObjectであり、プロキシを介してこのメ​​ソッドでアクセスされることに注意してください。ハンドルは、 FrameworkElementAdapters.ViewToContractAdapter()への呼び出しでリモートでも作成され、リモート メソッドの戻り値としてこのアプリケーション ドメインに渡されます。

私が受け取った例外はRemotingException occured - Permission denied: cannot call non-public or static methods です。

フィードバックは大歓迎です。

4

1 に答える 1

-1

表示されるメッセージには、非表示のメソッドを呼び出している可能性が含まれています。別のアセンブリのプライベートをチェックアウトすること (... 間違っているように聞こえます) は "タイプ セーフ" 操作ではなく、タイプ セーフでない操作を実行するには、CLR が提供できる最高の信頼である SkipVerification がアセンブリに必要です。CLR は、通常の「サンドボックス」タスクのアクセス許可を検証しないだけでなく、監視されていないサンドボックスからコードを出してしまいます。また、OS の警官が規則違反であなたをシャットダウンした場合、それはあなたの問題です。コードが非常に制限された許可スペースで実行されると述べたので、これがオプションであるとは思えません。

おそらく、Dispatcher.CheckAccess() が実行しているチェックを確認する必要があります。コールバック デリゲートを操作する能力について、誤検知が発生しているようです。

于 2010-09-29T15:15:39.907 に答える