我为Windows Compact Framework 3.5制作了一个应用程序,它似乎运行正常。
编译后,在我的计算机上创建了.exe
文件。 直到最近,我还可以在我的计算机上运行此exe文件。 (不使用模拟器)
但最近我注意到我的应用程序只能在移动设备上运行。当我尝试在台式计算机上运行它时,我收到一条奇怪的错误消息表示我应该使用[STAThread]
方法的Main()
指令运行我的应用程序。
但是,对于我的移动设备,这不是必需的,一切正常。实际上,我甚至无法将[STAThread]
添加到源代码中,因为紧凑的框架不支持它。 添加它会导致编译错误。
不幸的是,这也是现在的问题。 我想添加一些条件代码来评估它是否在Windows CE或Windows桌面上运行。当它在桌面上运行时,它应该以{{1}}模式启动代码。但是,我无法找到添加此类代码的方法,因为它无法编译。它始终归结为编译器不知道STAThread是什么。
有办法或技巧来处理这个问题吗?
对我来说,一个好的解决方法是以不同的方式编译它,也许是在我为桌面计算机编译时选择不同的目标平台。但是,我目前无法这样做。有什么想法吗?
答案 0 :(得分:0)
总之,代码只需要在台式计算机上运行时才能在STA状态下运行。此外,STA状态甚至不能在移动设备上使用。
这就是我提出的:
static void Main()
{
Type type = typeof(Thread);
MethodInfo methodInfo = type.GetMethod("SetApartmentState");
if (methodInfo != null)
{
// full .net framework
// --> requires STA apartmentstate
Thread thread = new Thread(() => Run());
methodInfo.Invoke(thread, new object[] { ApartmentState.STA });
thread.Start();
thread.Join();
}
else
{
// .net compact framework
// --> needs no special attention (can run in MTA)
Run();
}
}
注意:上面的Run()
方法是启动应用程序的方法。
由于代码是用Compact Framework编写的,因此无法直接设置单元状态,因为没有setApartmentState
方法。但幸运的是,它可以使用反射来完成,因为当代码在完整的.net框架上运行时(并且仅当代码运行)时,该方法实际上将在运行时可用。