运行 桌面计算机上的紧凑框架代码
running compact framework code on desktop computer
我申请了 Windows Compact Framework 3.5,看起来工作正常。
编译后在我的电脑上创建了一个 .exe
文件。 直到最近,我实际上还可以 运行 我的计算机上的这个 exe 文件 。 (不使用模拟器)
但最近我注意到我的应用程序在移动设备上只有 运行s。当我尝试在我的台式计算机上 运行 它时,我收到一条奇怪的错误消息,该消息 表明我应该 运行 我的应用程序使用 [STAThread]
指令 [=13] =]方法。
但是,对于我的移动设备来说,这不是必需的,一切正常。事实上,我什至无法将 [STAThread]
添加到源代码中,因为紧凑的框架不支持它。 添加它会导致编译错误。
不幸的是,这也是现在的问题。 我想添加一些条件代码来评估它是否在 Windows CE 或 Windows 桌面上 运行ning。 当它 运行在桌面上,它应该以 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 框架上的代码 运行 时。
我申请了 Windows Compact Framework 3.5,看起来工作正常。
编译后在我的电脑上创建了一个 .exe
文件。 直到最近,我实际上还可以 运行 我的计算机上的这个 exe 文件 。 (不使用模拟器)
但最近我注意到我的应用程序在移动设备上只有 运行s。当我尝试在我的台式计算机上 运行 它时,我收到一条奇怪的错误消息,该消息 表明我应该 运行 我的应用程序使用 [STAThread]
指令 [=13] =]方法。
但是,对于我的移动设备来说,这不是必需的,一切正常。事实上,我什至无法将 [STAThread]
添加到源代码中,因为紧凑的框架不支持它。 添加它会导致编译错误。
不幸的是,这也是现在的问题。 我想添加一些条件代码来评估它是否在 Windows CE 或 Windows 桌面上 运行ning。 当它 运行在桌面上,它应该以 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 框架上的代码 运行 时。