Deployment 为什么我的CE应用程序拒绝运行?
我已经维护了一段时间(一年多)的Windows CE应用程序,并不时制作新版本,将其复制到手持设备上并在那里运行新版本 不过,今天我第一次创建了一个新的Windows CE应用程序。这是一个非常简单的实用程序 为了在VS2008中创建它,我选择了一个C#“智能设备项目”模板,添加了一些控件和一些代码,并构建了它 以下是我选择的一些选项: 我将通过构建项目生成的.exe复制到手持设备的Program Files文件夹: …但它不会运行。它在错误的位置吗?是否需要复制一些辅助文件?是否需要进行其他类型的设置才能使其运行?还是什么 更新 由于内容不多,我将粘贴以下所有代码,以防有人认为我的代码可能是问题:Deployment 为什么我的CE应用程序拒绝运行?,deployment,compact-framework,windows-ce,smart-device,handhelddevice,Deployment,Compact Framework,Windows Ce,Smart Device,Handhelddevice,我已经维护了一段时间(一年多)的Windows CE应用程序,并不时制作新版本,将其复制到手持设备上并在那里运行新版本 不过,今天我第一次创建了一个新的Windows CE应用程序。这是一个非常简单的实用程序 为了在VS2008中创建它,我选择了一个C#“智能设备项目”模板,添加了一些控件和一些代码,并构建了它 以下是我选择的一些选项: 我将通过构建项目生成的.exe复制到手持设备的Program Files文件夹: …但它不会运行。它在错误的位置吗?是否需要复制一些辅助文件?是否需要进行其
using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
namespace PrinterCommanderCE
{
public partial class PrinterCommanderForm : Form
{
public PrinterCommanderForm()
{
InitializeComponent();
}
private void btnSendCommands_Click(object sender, EventArgs e)
{
SendPrinterCommands();
}
private void SendPrinterCommands()
{
bool successfulSend = false;
const string quote = "\"";
string keepPrinterOn = string.Format("! U1 setvar {0}power.dtr_power_off{0} {0}off{0}", quote);
string shutPrinterOff = string.Format("! U1 setvar {0}power.dtr_power_off{0} {0}on{0}", quote);
string advanceToBlackBar = string.Format("! U1 setvar {0}media.sense_mode{0} {0}bar{0}", quote);
string advanceToGap = string.Format("! U1 setvar {0}media.sense_mode{0} {0}gap{0}", quote);
if (radbtnBar.Checked)
{
successfulSend = SendCommandToPrinter(advanceToBlackBar);
}
else if (radbtnGap.Checked)
{
successfulSend = SendCommandToPrinter(advanceToGap);
}
if (successfulSend)
{
MessageBox.Show("label type command successfully sent");
}
else
{
MessageBox.Show("label type command NOT successfully sent");
}
if (ckbxPreventShutoff.Checked)
{
successfulSend = SendCommandToPrinter(keepPrinterOn);
}
else
{
successfulSend = SendCommandToPrinter(shutPrinterOff);
}
if (successfulSend)
{
MessageBox.Show("print shutoff command successfully sent");
}
else
{
MessageBox.Show("print shutoff command NOT successfully sent");
}
}
private bool SendCommandToPrinter(string cmd)
{
bool success = false;
try
{
SerialPort serialPort = new SerialPort();
serialPort.BaudRate = 19200;
serialPort.Handshake = Handshake.XOnXOff;
serialPort.Open();
serialPort.Write(cmd);
serialPort.Close();
success = true;
}
catch
{
success = false;
}
return success;
}
}
}
更新2
基于,我在应用程序中添加了一个全局异常处理程序,因此Program.cs现在是:
namespace PrinterCommanderCE
{
static class Program
{
[MTAThread]
static void Main()
{
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(GlobalExceptionHandler);
Application.Run(new PrinterCommanderForm());
}
static void GlobalExceptionHandler(object sender, UnhandledExceptionEventArgs args)
{
Exception e = (Exception)args.ExceptionObject;
MessageBox.Show(string.Format("GlobalExceptionHandler caught : {0}", e.Message));
}
}
}
然而,运行新版本并没有显示什么——它只是在杰克·鲁比的友好访问之后,以几乎和李·哈维·奥斯瓦尔德一样的冗长瞬间“闪现”
更新3
问题是否与此有关?如果是,如何解决
我的更新版本和这个全新简单的应用程序都拒绝运行,这表明在编码、构建或部署过程中存在一些根本性的缺陷
更新4
由于这是一个最小的实用程序,它(以及我的遗留应用程序,涉及的更多)无法工作的原因可能与项目属性、它是如何构建的、所需的文件没有被复制,或者
注意:桌面图标为“通用”(看起来像一个空白的白色表单);这可能表明存在问题,但这是错误的指示,还是一个次要(仅限于美学)问题
更新5
在项目>属性…,平台设置为“活动(任何CPU)”,平台目标相同(“活动(任何CPU)”)
我读到这是错误的,它应该是“x86”,但没有“x86”选项可用-任何CPU都是唯一的
更新6
在项目>属性中…>在设备上,选中“部署最新版本的.NET Compact Framework(包括Service Pack)”。这是应该的吗
更新7
好吧,这是这一切中最奇怪的部分:
我有两个CF/CE应用程序需要在这些摩托罗拉/Symbol 3090和3190手持设备上运行
一个是上面讨论的简单实用程序。我发现它确实在其中一个设备上运行(3190,FWIW)。因此,它在一台设备上运行,而不是在另一台设备上运行
然而,另一个(legacy.exe)则相反——它运行在3090上(该实用程序甚至不会启动),但不会运行在3190上
因此,3190满足了实用程序的需求,3090满足了遗留util的需求。但是,新版本的旧版应用程序不会在任何一台设备上运行
我很困惑;当我谈到他的三个接球手中的一个时,我的感觉是肯定的:“我有一个能投但不能接,一个能接但不能投,还有一个能打但两者都不能做。”
更新8
3190安装了更新版本的CF;新的和旧的应用程序似乎都应该在新的设备上运行,并且有更新的CE,但是它们没有-只有针对新框架构建的应用程序才有
更新9
以下是3090的外观:
更新10
所以我有两个前任,一个在设备上运行(现在两个),另一个在两个设备上都不会运行。这两个exesw看起来几乎相同。我将它们与三种工具进行了比较:红门网反射器;JetBrains的dotPeek和Dependency Walker
以下是我的发现:
Dependency Walker
两者似乎在缺少依赖项方面都有相同的错误(我没有将它们与它们的依赖程序集放在同一文件夹中,这可能是问题所在)
.NET反射器
非工作文件具有工作文件没有的条目:
[assembly: Debuggable(0x107)]
这是问题所在吗?如果是,我该如何改变
JetBrains dotPeek
exe工作副本中的引用均为版本1.0.50000.0
非工作exe具有相同的引用列表和相同的版本号
但有一点不同:
对于working.exe,dotPeek说,“1.4.0.15,msil,Pocket PC v3.5”
对于不工作的.exe,dotPeek说,“1.4.0.15,msil,.NETFramework v4.5”
这就是问题所在吗?如果是,我如何更改非工作的.exe以匹配工作的
最后一个是令人不安的,主要是因为我在项目的非工作(较新)版本中没有看到“4.5”字符串存在的地方。dotPeek从哪里得到这些信息
更新11
我现在知道问题出在这两个MessageBox.Show()之间,因为我看到的是第一个,而不是第二个:
public static int Main(string [] args)
{
try
{
// A home-brewed exception handler (named ExceptionHandler()) is already defined, but I'm adding a global one
// for UNHANDLED exceptions (ExceptionHandler() is explicitly called throughout the code in catch blocks).
MessageBox.Show("made it into Main method"); // TODO: Remove after testing <= this one is seen
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(GlobalExceptionHandler);
string name = Assembly.GetExecutingAssembly().GetName().Name;
IntPtr mutexHandle = CreateMutex(IntPtr.Zero, true, name);
long error = GetLastError();
if (error == ERROR_ALREADY_EXISTS)
{
ReleaseMutex(mutexHandle);
IntPtr hWnd = FindWindow("#NETCF_AGL_BASE_",null);
if ((int) hWnd > 0)
{
SetForegroundWindow(hWnd);
}
return 0;
}
ReleaseMutex(mutexHandle);
DeviceInfo devIn = DeviceInfo.GetInstance();
Wifi.DisableWifi();
// Instantiate a new instance of Form1.
frmCentral f1 = new frmCentral();
f1.Height = devIn.GetScreenHeight();
f1.Text = DPRU.GetFormTitle("DPRU HHS", "", "");
MessageBox.Show("made it before Application.Run() in Main method"); // TODO: Remove after testing <= this one is NOT seen
Application.Run(f1);
devIn.Close();
Application.Exit();
return 0;
}
catch(Exception ex)
{
DPRU.ExceptionHandler(ex, "Main");
return 0;
}
} // Main() method
publicstaticintmain(字符串[]args)
{
尝试
{
//已经定义了一个自制的异常处理程序(名为ExceptionHandler()),但我正在添加一个全局异常处理程序
//对于未处理的异常(在catch块中的整个代码中显式调用ExceptionHandler()。
MessageBox.Show(“使其成为主方法”);//TODO:测试后删除0)
{
setforegroundindow(hWnd);
}
返回0;
}
释放互斥(mutexHandle);
DeviceInfo devIn=DeviceInfo.GetInstance();
Wifi.DisableWifi();
//实例化Form1的新实例。
frmCentral f1=新的frmCentral();
f1.Height=devIn.GetScreenHeight();
f1.Text=DPRU.GetFormTitle(“DPRU-HHS”,“”,“”);
MessageBox.Show(“在主方法中的Application.Run()之前创建”);//TODO:Remove