How to get block instances in C#

Not sure what I'm doing wrong, but this always generates a casting error, 'System.InvalidCastException'.

Here's my short bit of code:

public void Main()

        {

            ModelDoc2 swDoc = (ModelDoc2)swApp.ActiveDoc;

            BlockInstance swBlkIns;

            BlockDefinition swBlkDef;

            SketchManager swSkMgr = swDoc.SketchManager;

            object[] swBlkDefs = (object[])swSkMgr.GetSketchBlockDefinitions();

            int swBlkCnt = swBlkDefs.GetLength(0);

            for (int i = swBlkDefs.GetLowerBound(0); i <= swBlkDefs.GetUpperBound(0); i ++)

            {

                swBlkDef = (BlockDefinition)swBlkDefs[i]; // Error always happens here,

                swBlkIns = (BlockInstance)swBlkDefs[i];   // or here.

            }

I'm guessing I'm missing a step, I haven't found any C# examples of selecting drawing blocks, just VBA, so I'm guessing I need to something in between?

This is SolidWorks2016, SP5.

Thanks for any help.

SolidworksApi/macros