解决GitLab CI中文乱码问题

在中文版Windows操作系统上使用GitLab CI Runner的时候,如果命令行的输出包含中文,则在GitLab中看到的流水线(Pipeline)日志会出现乱码情况。为了解决这个问题,可以在Runner的初始化脚本中插入语句“chcp 65001”,将命令行输出编码设为UTF-8,之后GitLab的流水线日志就能正常显示MSBuild的中文输出了。

继续阅读“解决GitLab CI中文乱码问题”

在Ubuntu上编译多架构Docker镜像

Docker能够在包括ARM64、Power PC等很多不同架构的处理器平台上运行。然而,有些处理器平台上不容易找到可用于构建容器镜像的设备。例如,常见的能够运行Docker的ARM设备包括Raspberry Pi、NAS等,它们通常拥有较小的内存和性能普通的处理器,不太能够胜任构建容器镜像的任务。通过Docker的实验性功能Docker Buildx以及多平台仿真软件QEMU,可以实现在x64平台的Ubuntu操作系统中为多种架构构建Docker镜像。

继续阅读“在Ubuntu上编译多架构Docker镜像”

通过MSBuild任务自动复制DLL文件

在Visual Studio中使用第三方库的时候,若第三方库没有通过NuGet分发,则通常需要自行将DLL文件复制到生成目录才能正常运行程序。通过将文件直接包含到项目中可以自动完成该任务,但会在解决方案资源管理器中看到大量DLL文件。本文介绍一种方法,通过在MSBuild文件(csproj、vcxprj等)中添加目标和任务,实现生成时自动将DLL文件复制到生成目录。

继续阅读“通过MSBuild任务自动复制DLL文件”

.NET项目自动复制VC++生成的动态库

如果要在.NET的项目中使用同一个解决方案中的Visual C++动态链接库项目中的函数,则需要将Visual C++项目中生成的.dll文件复制到.NET项目的输出路径中,否则.NET程序运行时将无法加载所需的.dll文件。

使用“添加引用”功能在.NET项目中添加对Visual C++项目的引用是没有用的。MSBuild并不会把.dll文件复制到.NET项目的输出目录。

继续阅读“.NET项目自动复制VC++生成的动态库”

.NET中读取HTTP请求的文件名

HTTP的响应头中的Content-Disposition项会给出建议的文件名。而.NET网络库的HttpResponseMessage.Headers中并不包含Content-Disposition这一项。以下代码会得到null,而不是相应的响应头:

using (HttpClient client = new HttpClient())
{
    var request = new HttpRequestMessage(HttpMethod.Head, uri);
    var result = await client.SendAsync(request);
    result.Headers.TryGetValues("Content-Disposition", out IEnumerable<string> values);
    return values;
}
继续阅读“.NET中读取HTTP请求的文件名”

使用Visual Studio调试闪退问题

编写.NET或UWP软件时,Visual Studio是常用的的调试工具之一。其监视、调用堆栈等功能在对程序逻辑进行查错时十分有用。但如果软件在Visual Studio中启动时一切正常,在别的地方启动(比如后台任务、文件打开甚至在其他电脑上使用时)时却发生闪退,该如何进行调试呢?本文介绍如何创建内存转储文件(Dump)并使用Visual Studio进行“事后调试”,以实现对闪退故障的调试。

继续阅读“使用Visual Studio调试闪退问题”

P/Invoke以指针形式传递结构体内的数组

在使用P/Invoke(平台调用)从.NET(例如C#)调用C++本机函数时,可以选择将数组以指针的形式传递。但如果数组是结构体中的成员时,就只能通过SafeArray或者按值传递数组的方式传递了,无法用指针的形式传递。那么问题来了,如果要在P/Invoke中使用一个带有动态数组成员的结构体,又不想用SafeArray,该如何实现呢?

继续阅读“P/Invoke以指针形式传递结构体内的数组”