在台式机上运行紧凑的框架代码
我为Windows Compact Framework 3.5创建了一个应用程序,该应用程序看起来工作正常。
编译后,我的电脑上创建了一个.exe
文件。 直到最近,我实际上也可以在我的电脑上运行这个exe文件 。 (不使用模拟器)
但最近我注意到我的应用程序只能在移动设备上运行。 当我尝试在桌面计算机上运行它时,收到一条奇怪的错误消息, 指示我应该使用Main()
方法的[STAThread]
指令运行我的应用程序。
但是,对于我的移动设备,这不是必需的,一切正常。 事实上,我甚至无法将[STAThread]
添加到源代码中,因为紧凑框架不支持它。 添加它会导致编译错误。
不幸的是,这也是现在的问题。 我很想添加一些条件代码来评估它是否在Windows CE或Windows桌面上运行。 当它在桌面上运行时,它应该以STAThread
模式启动代码。 但是, 我找不到添加这种代码的方法 ,因为它不能编译。 它总是归结为编译器不知道STAThread是什么。
有没有办法或技巧来处理这个问题?
对我来说一个很好的解决方法是以不同的方式编译它,也许在我为桌面计算机编译时选择不同的目标平台。 但是,我目前无法这样做。 有任何想法吗 ?
总之,代码只需要在台式计算机上运行时在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框架上运行时(并且只有当代码运行时),该方法实际上才会在运行时可用。