在C#中调用和调试C++代码

在使用.NET开发时,由于种种原因,可能希望使用C++编写部分代码,例如希望通过使用C++提高性能,或是希望重用既有的代码。而.NET平台提供了平台调用(P/Invoke)功能,可以方便地调用其他语言编写的动态链接库(dll)。平台调用功能可以在各种.NET环境,包括.NET Core、.NET Framework、UWP下使用。

继续阅读“在C#中调用和调试C++代码”

替代lock语句块实现await独占访问

C#中有lock语句块和Monitor类可以实现线程锁,实现对资源的独占访问。但是,当像下面这样试图在lock语句块中使用await时会出现错误,无法生成:

lock (streamReader)
{
    await streamReader.ReadLineAsync();
} //编译错误

此时,也不能自作聪明地使用Monitor类实现线程锁,那样虽然能够生成,但是执行结果与你设想的是不同的。像下面这样的代码并不能实现独占访问:

Monitor.Enter(streamReader);
await streamReader.ReadLineAsync();
Monitor.Exit(streamReader); //不能实现功能

继续阅读“替代lock语句块实现await独占访问”

UWP Application类解析

每一个C# UWP应用中,必不可少的一个文件就是App.xaml.cs。App类是整个程序的入口,它继承了Application类。在App.xaml.cs中,我们可以通过重写Application类中的一些函数,来自定义程序启动时的行为。

在默认UWP模板中,OnLaunched函数担任了初始化程序窗口的工作。但实际上,一个UWP应用的生命周期中,OnLaunched函数可能被调用任意次(包括0次或者很多次)。所以,在初始化程序窗口的时候,必须考虑重复初始化的问题。新手很容易犯的一个错误是在OnLaunched函数中绑定OnBackRequested函数,这样会导致在某些情况下,按一次后退键后退多个页面,或是在某些情况下后退键无效的问题。

继续阅读“UWP Application类解析”

如何判断UWP应用是否具有焦点

桌面版本Windows中,一个UWP应用只有在被最小化的时候才会引发Suspending事件,在使用了扩展执行(Extended Execution)(参见使用扩展执行最小化运行)的情况下,更是不知什么时候才会引发Suspending事件了。手机系统中,Suspending同样不能代表应用不具有焦点。所以,使用Suspending和Resuming事件判断应用是否具有焦点是不可行的。

继续阅读“如何判断UWP应用是否具有焦点”