Что-то ты нагородил всего.
Во-первых, нужно знать, какой код на C++: .NET или нет.
Если это код .NET, то и типы должны быть .NET. В данном случае
array<int> ^num
size передавать бессмысленно по той причине, что он и так хранится внутри массива и доступен по свойству Length.
Если это код не .NET, то типы должны быть C++. В данном случае
int *num
Опять же, указание размера большого смысла не имеет, поскольку массив всегда (кроме статических массивов в структурах) передаётся по указателю. Но если так хочется, то можно и указать
int num[12]
Однако для вызова такого кода нужно будет, во-первых, объявить декларацию экспорта из DLL:
extern "C" void _declspec(dllexport) fooV(int *num)
И при этом функция должна быть оформлена на языке C: не может быть членом класса и использовать классы в параметрах.
Во-вторых, импортировать её в C#:
[DllImport("my.dll")]
static extern void fooV(int[] num);