在解决方案中,我有几个.exe
个文件位于同一目录中。其中一个是主菜单,它查找所有其他可执行文件的路径(在同一个目录中)并分配给表单中的按钮。单击该按钮时,它的底层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.Login
是一个UserControl,其构造函数中包含TextBox.Focus()
。我试图将它移到'Validated'事件处理程序但结果是相同的,但有一点不同,这次它在Form.Load()
尝试设置自己的可见性时崩溃。
设备复位后可以重复该循环。最重要的是,如果我直接运行任何子可执行文件,那么这些启动和工作一直都很好。
相同的代码集在WinMo 6.1上运行正常。我也使用OpenNETCF的Application2
类 - 尝试用标准Application
类替换它,结果相同。试图设置Process.StartInfo.WorkingDirectory
和UseShellExecute
但又没有快乐。在“主菜单”应用程序中查看Process()
对象时 - 它的行为符合预期(创建进程,在.Start()
上返回'true')。
没有任何程序集安装到GAC,所有文件都驻留在同一个目录中。
任何线索?
[编辑]
在我收到错误并且设备保持不动约10分钟后,它们全部恢复启动:我可以再次运行子应用程序等。
我尝试从主菜单中擦除对当前进程的引用,终止进程,调用GC.Collect()
但没有结果。
[编辑]
Loader日志在这一点上看起来很好(这是app开始失败的地方):
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
复制到app installdir:
Loading module [\windows\en\System.SR.resources.dll]
Attempt to load [\windows\en\System.SR.resources.dll] has failed (err 0x80001001)
已安装System_SR_ENU.CAB
和NETCFv2.wm.armv4i.cab
但现在日志显示无法加载其中一个特定于设备的dll(ITCScan.DLL
),我认为这是.NET 3.5程序集。
据我所知System.SR
仅在.NET2中使用,是不是有其他异常试图浮出水面并表现为这样?
答案 0 :(得分: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();
}
App B在构造函数中有一个额外的参数,即表单A.我使用该表单来管理application.exit()。调用该函数将关闭整个系统(APP A和B)。而不是你应该使用A.show();
public void BackToAppA()
{
A.show();
}
答案 1 :(得分:0)
我的猜测是你正在运行的第一个可执行文件(称为 Exe A )仍在运行。
当有人点击菜单上与 Exe A 对应的按钮时,请查看所有正在运行的进程以查看它是否已在运行。如果是这样,只需将 Exe A 拉到前面。
这可能不是您问题的解决方案,但是当我阅读您所描述的内容时,这是我想到的第一件事。在Windows Mobile下,当有人关闭它时,应用程序不一定会关闭,除非该应用程序的创建者确保它确实存在。
我希望这会有所帮助。