Determine if library loaded into Console, Desktop, or UWP app
我有一个库,它对于控制台应用程序,桌面应用程序(例如WPF)和UWP应用程序的行为必须有所不同。
如何在运行时确定将我的库加载到哪种应用程序类型?
确定它是否是控制台应用程序似乎很容易:如何判断是否有控制台
对于UWP,我可能可以确定是否已加载WinRT。但是如何?
桌面应用程序具有哪些区别属性?
- 仅作说明。第一个描述并不能总是(正确地)告诉您您拥有控制台应用程序。 (例如,当您使用输入/输出重定向时)有关详细信息,请参阅:stackoverflow.com/a/48237650/2826535并且第二个描述可用于检测操作系统或已安装的组件,而不是活动环境。我想知道哪种类型的库针对不同的环境需要不同的行为。我想不到任何原因。因此,恕我直言,在我看来,这是一种不良的设计或方法。
-
这是一个蓝牙库。实际上,仅UWP支持它。但经过一些调整,它也适用于桌面应用程序。对于控制台,它变得更加复杂,因为没有用于异步上下文的UI线程。
-
这解释了原因。尝试查看(并测试)stackoverflow.com/a/8711036/2826535和该问题的其他答案。这可能可以帮助您确定某些应用程序状态。但是,没有什么是完美的。总有进/出重定向。我确定我能够在控制台应用程序中的控制台应用程序中启动消息处理("仅用于托盘图标"应用程序的测试目的),但是该代码是旧的并且在我的公司中。另一种选择是测试现有的库(例如!(Type.GetType("Mono.Runtime") is null)),但是我不确定这是否可以工作(并且不安全)。
我最终定义了以下enum:
1 2 3 4 5 6
| public enum ExecutionMode
{
Console,
Desktop,
UniversalWindowsPlatform
} |
传递给我的库的主类的构造函数。这不是一个新主意,但是非常可靠(如果使用正确)。