2

.exeソリューションでは、同じディレクトリにいくつかのファイルがあります。それらの 1 つはマスター メニューです。これは、他のすべての実行可能ファイルのパス (同じディレクトリ内) を検索し、フォーム内のボタンに割り当てます。ボタンをクリックすると、その下にある exe が 経由で起動されProcess.Start()ます。

それぞれexeが個別のインストール CAB にパックされています。最初のインストール後、マスター メニューを実行し、任意のボタンを選択すると、基になるアプリが正常に起動します。終了してから、同じアプリまたは他のアプリを再度実行しますが、今回は次のようにクラッシュします。

TypeLoadException
   at System.Windows.Forms.Control.OnGotFocus(EventArgs e)
   at System.Windows.Forms.Control.WnProc(WM wm, Int32 wParam, Int32 lParam)
   at System.Windows.Forms.Control._InternalWnProc(WM wm, Int32 wParam, Int32 lParam)
   at Microsoft.AGL.Forms.WL.SetFocus(IntPtr hwnFocus)
   at System.Windows.Forms.Control.Focus()
   at myApp.Login..ctor()
   at myApp.Form_UnderApp1.InitializeComponent()
   at myApp.Form_UnderApp1..ctor()
   at myApp.Program.Main()

myApp.LoginTextBox.Focus()コンストラクターにある UserControlです。「検証済み」イベントハンドラーに移動しようとしましたが、結果は同じですが、今回Form.Load()は独自の可視性を設定しようとするとクラッシュするという違いがあります。

デバイスのリセット後、このサイクルを繰り返すことができます。最も重要なことは、子実行可能ファイルのいずれかを直接実行すると、それらが起動して常に正常に動作することです。

同じコード セットが WinMo 6.1 でも正常に動作します。私もOpenNETCFのApplication2クラスを使用しています-それを標準クラスに置き換えてみましたApplicationが、同じ結果になりました。設定しようとしましProcess.StartInfo.WorkingDirectoryUseShellExecuteが、再び喜びはありません。Process()「マスターメニュー」アプリでオブジェクトを見ると、期待どおりに動作します(プロセスを作成し、「true」を返す.Start()など)。

アセンブリは GAC にインストールされず、すべてのファイルが同じディレクトリに存在します。

手がかりはありますか?

[編集]

エラーが発生し、デバイスが約10分間放置された後、すべてが開始されます。サブアプリを1回実行できます。マスターメニューから現在のプロセスへの参照を消去し、プロセスを強制終了し、呼び出しGC.Collect()結果なし。

[編集]

ローダー ログは、この時点まで問題ないように見えます (ここからアプリが失敗し始めます)。

Redirecting [Microsoft.WindowsCE.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=969DB8053D3322AC] to [Microsoft.WindowsCE.Forms, Version=3.5.0.0, Culture=neutral, PublicKeyToken=969DB8053D3322AC]
Loading module [\windows\GAC_Microsoft.WindowsCE.Forms_v3_5_0_0_cneutral_1.dll]
Loaded [Microsoft.WindowsCE.Forms, Version=3.5.0.0, Culture=neutral, PublicKeyToken=969DB8053D3322AC] from [\windows\GAC_Microsoft.WindowsCE.Forms_v3_5_0_0_cneutral_1.dll]
Loading module [\Program Files\MyApp\System.SR.dll]
Attempt to load [\Program Files\MyApp\System.SR.dll] has failed (err 0x80001000).
Loading module [\Program Files\MyApp\System.SR.exe]
Attempt to load [\Program Files\MyApp\System.SR.exe] has failed (err 0x80001000).
Loading module [\windows\System.SR.dll]
Attempt to load [\windows\System.SR.dll] has failed (err 0x80001000).
Loading module [\windows\System.SR.exe]
Attempt to load [\windows\System.SR.exe] has failed (err 0x80001000).
Failed to load [System.SR, Version=3.5.0.0, Culture=neutral, PublicKeyToken=969DB8053D3322AC]

System.SR.dllアプリのインストール ディレクトリにコピーした後:

Loading module [\windows\en\System.SR.resources.dll]
Attempt to load [\windows\en\System.SR.resources.dll] has failed (err 0x80001001)

インストールさSystem_SR_ENU.CABNETCFv2.wm.armv4i.cabましたが、デバイス固有の dll ( ITCScan.DLL) の 1 つを読み込めないことがログに記録されています。これは .NET 3.5 アセンブリであると考えられます。私の知る限りSystem.SR.NET2でのみ使用されていますが、他の例外が表面化しようとしていて、このように現れているのではないでしょうか?

4

2 に答える 2

1

私は同じ問題を抱えていて、それを解決できませんでした。アプリを呼び出す別の方法を探す必要がありました。

私がしたことは、フォームBのコンストラクターにパラメーターを入れてから、 Aから呼び出すことです。これらのパラメーターは、 Bアプリの .exe の引数と同じです。

呼び出しコード:

MyAppNameSpace.MyForm _B = new MyAppNameSpace.MyForm(UserID,Date,this);
F.Show();

コンストラクタ:

public MyForm(string _U, DateTime _d, Form _PrevForm)
{
   Form A = _PrevForm;
   string U = _U;
   DateTime d = _d;
   InitializeComponent();
}

アプリ B には、フォーム A であるコンストラクターに追加のパラメーターがあります。私はそのフォームを使用して application.exit() を管理します。その関数を呼び出すと、システム全体 (APP A および B) が終了します。その代わりに、 A.show(); を使用する必要があります。

public void BackToAppA()
{
   A.show();
}
于 2014-11-18T16:00:37.710 に答える
0

私の推測では、実行している最初の実行可能ファイル ( Exe Aと呼びます) がまだ実行されています。

誰かがメニューの Exe Aに対応するボタンをクリックしたら、実行中のすべてのプロセスを調べて、それが既に実行されているかどうかを確認します。その場合は、 Exe Aを手前に引くだけです。

これはあなたの問題の解決策ではないかもしれませんが、あなたの説明を読んだときに最初に頭に浮かぶことです. Windows Mobile では、アプリの作成者が確実に閉じない限り、誰かがアプリケーションを閉じたときに必ずしもアプリケーションが閉じるとは限りません。

これが役立つことを願っています。

于 2012-05-12T23:50:11.623 に答える