私のWPF
アプリケーションではOpenFileDialog
、画像を選択してアプリにロードしていましたが、これは期待どおりに機能します。
しかし、フラッシュドライブから同じアプリを実行すると、UI
フリーズ後に画像が読み込まれ、クリックするUI
とアプリがクラッシュします。
manifest
アプリの管理者もいます。
私のWPF
アプリケーションではOpenFileDialog
、画像を選択してアプリにロードしていましたが、これは期待どおりに機能します。
しかし、フラッシュドライブから同じアプリを実行すると、UI
フリーズ後に画像が読み込まれ、クリックするUI
とアプリがクラッシュします。
manifest
アプリの管理者もいます。
適切な説明が見つかりませんでしたが、有効なローカル パス (たとえば、Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)) を使用して InitialDirectory を設定することで、この問題を解決しました。
この場合OpenFileDialog
、アプリがハングしてクラッシュします。
OpenFileDialog
ということで新スレに移動。そして、すべてがうまくいきます。
ネットワークドライブから実行しているときに、これに似たものを見たことがあります。アプリケーションが完全に信頼できるソースからロードされていない場合、SecurityException が発生する可能性があります。
いずれにしても、例外が発生しているかどうかを確認できないコードの周りに try/catch ブロックを追加してみてください。
この問題は、WPF だけでなく、WinForms でも発生 (クラッシュ) することがわかりました。問題の原因を特定するのは難しいですが、それでも OpenFileDialog 関連の Microsoft dll にバグがあるようです (私の場合、CmnDlg32.dll でした)。
ShowDialog() 関数を呼び出すことができる唯一の方法は、イベントでラップし、次の助けを借りて呼び出すことでした
this.BeginInvoke(
new Action<YourObject, EventArgs>(YourObject_FileDialogOpened), new object[]
{ YourObjectInstance, e });
ここで、"this" はコントロール (フォームなど) です。
呼び出す BeginInvoke(...) 許可は、適切な方法で処理されます。
ボタンクリックイベントまたは他の同様のシナリオで OpenFileDialog の呼び出しを使用する場合、問題は発生しません。
次のようなものを使用します。
Dispatcher.Invoke(new Action(() =>
{
using (SaveFileDialog fd = new SaveFileDialog())
{
var json = JsonConvert.SerializeObject(arScene, Formatting.Indented);
var bytes = UTF8Encoding.UTF8.GetBytes(json); // or any byte array data
fd.Filter = "JSon files (*.json)|*.json|All files (*.*)|*.*|ARScene (*.ARScene)|*.ARScene";
fd.Title = "Save an ARScene File";
fd.AutoUpgradeEnabled = true;
fd.DefaultExt = "ARScene";
fd.OverwritePrompt = false;
fd.RestoreDirectory = true;
fd.SupportMultiDottedExtensions = true;
fd.CreatePrompt = false;
if (fd.ShowDialog() == DialogResult.OK)
{
if (fd.FileName != "")
{
FileStream fs = (FileStream)fd.OpenFile();
if (fs != null)
{
fs.Write(bytes, 0, bytes.Length);
fs.Close();
}
}
}
fd.Dispose(); // not needed, but save;-)
}
}));