信頼されていないSilverlight 5.1.10411.0 Out-of-Browserアプリケーションがあり、 App.Current.MainWindow.Closeメソッドを使用してアプリケーションを閉じようとしています。ドキュメントによると、次の条件のいずれかが true の場合にのみ、このメカニズムを使用できます。
- 信頼できるアプリケーションです (私のアプリケーションには当てはまりません)
- Application.Startup イベントが完了する前 (私のアプリケーションには当てはまりません)
- ユーザーが開始したアクションに応答して、たとえば、ボタンのクリックイベントハンドラーで (これは私が作業しようとしているものです)
これを機能させるための私の試みでは、物事を非常に単純に保ち、以下に示すようにコードビハインドボタンクリックイベントハンドラーでメソッドを直接呼び出していますが、効果はありません.
void closeButton_Click(object sender, RoutedEventArgs e)
{
var mainWindow = Application.Current.MainWindow;
mainWindow.Close();
}
デバッガーをアタッチして「例外がスローされたときにブレーク」を設定すると、例外が表示されます
SecurityException: アプリケーションのアクセス許可が昇格されているか、ユーザーが開始したアクションによってコードが呼び出された場合を除き、プロパティまたはメソッド呼び出しへのアクセスは許可されません。
私のコードがユーザーが開始したアクションと見なされない理由はありますか?
XAML とコード ビハインドの両方にイベント ハンドラーをアタッチしようとしました (同時にではありません)。
<Button x:Name="closeButton" Content="Close" Click="closeButton_Click" />
また
closeButton.Click += closeButton_Click;
成功せずに。User-Initiated Eventsのドキュメントを注意深く読みましたが、コードがユーザーによって開始されたと見なされない理由がわかりません。デバッグ モードとリリース モードの両方でこれを試しましたが、デバッガーが接続されていない場合でも成功しませんでした。「ブラウザー外で実行する場合は昇格した信頼が必要」を true に変更すると、クローズ コールが期待どおりに機能します。
この問題を回避するためにアプリケーション要件を再定義しましたが、何が間違っているのかを本当に理解したいと思います;-)
更新: SonOfPirateの回答は、この方法のドキュメントが正確ではないことを示していますが、私は確信していません。リフレクション ツールdotPeekを使用して、例外をスローしているメソッドは
private void CheckForPermissions()
{
if (!Application.Current.HasElevatedPermissions && !XcpImports.IsUserInitiatedAction() && Application.Current.ApplicationStarted)
throw new SecurityException(Resx.GetString("Window_AccessNotAllowed"));
}
私はこれを読むのが少し混乱しているので、この要点に示されているようにコードをモックし、単体テストを書きました。結果からわかるように、信頼されていないアプリケーションから close を呼び出すことができるはずです。始めました。
セキュリティ例外メッセージ
アプリケーションのアクセス許可が昇格されているか、ユーザーが開始したアクションによってコードが呼び出された場合を除き、プロパティまたはメソッド呼び出しへのアクセスは許可されません。
また、それが可能であることを示しているので、質問に戻ります-なぜこのコードはユーザーが開始したと見なされないのですか?