I’d always assumed that creating a Runtime Callable Wrapper by adding a reference to the COM component in Visual Studio would generate the same interop code as was generated by using the command line tool TlbImp. That would seem not to be true in at least one case that I’ve discovered, take this VB6 method code for example:
1: Public Function ProcessArray(ByRef numbers() As Integer)
2: Dim biggest As Integer
3: r = 0
4: For i = 0 To UBound(numbers)
5: If numbers(i) > r Then
6: r = numbers(i)
7: End If
8: Next i
9: ProcessArray = r
10: End Function
Adding a reference in Visual Studio results in an interop method that looks like this:
Which is not type safe (ByRef System.Array).
Generating the wrapper using TlbImp gave me this signature:
Why do we get this difference? Visual Studio still runs TlbImp, but with the /sysarray switch which forces the use of System.Array. The advantage of the System.Array is that it supports non-zero lower bounds! Check the documentation for its CreateInstance method.