Well, these assemblies are not really duplicates - the are named according to assembly naming conventions, where the name follows <company>.<component>.dll pattern, it often includes the namespace too.
Microsoft.SPOT.Hardware.dll contains the hardware classes of Microsoft's SPOT, which was the original name of what is now known as .NET Micro Framework. The documentation is available on MSDN (version 4.2, version 4.3).
Assemblies that start with SecretLabs are vendor-specific extensions that provide additional functionality, it can be common for all SecretLabs boards (SecretLabs.NETMF.Hardware) or only for a selected board - then it is indicated by the board name, i.e. SecretLabs.NETMF.Hardware.NetduinoPlus contains features available only on/for NetduinoPlus.
Also, the assembly contents can be inspected in Visual Studio's Object Browser, or using tools like .NET Reflector (or similar). You'd need to include a particular assembly in your project when you want to use a type exposed from that assembly.
AFAIK there are a few assembly-related problems people usually encounter while working with .NET MF projects:
- When the project is not created from SecretLabs template, it does not include SecretLabs.*.dll assemblies, so they must be added manually.
- Certain types are in assemblies that are not included by default and must be added manually (e.g. System.IO.Ports for SerialPort). Sometimes, the name of the assembly does not match its counterpart in the 'full' .NET Framework, which some people might find confusing.
- After upgrading the SDK or device firmware, in projects that still reference old version of assemblies there is often a mismatch during deployment. It is necessary to either change target .NET MF version in project settings, or update the references (i.e. remove existing, add new).
Welcome to the community!