.NET中SortedDictionary、SortedList和SortedSet

.NET Core / .NET Standard标准库中,命名空间System.Collections.Generic中,一些类是通过包System.Collections分发的。本文分析了该包中不那么基础又有点令人混淆的SortedDictionarySortedListSortedSet这三个类,并对有些相似的SortedListSortedSet进行了一些性能对比。

System.Collections包的源代码位于https://github.com/dotnet/runtime/tree/master/src/libraries/System.Collections

继续阅读“.NET中SortedDictionary、SortedList和SortedSet”

通过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++生成的动态库”

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

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

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

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

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

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