Скорее всего, ваша проблема в том, что вы не завершили объявление взаимодействия. Как я уже говорил, большинство ваших «строковых» параметров действительно являются параметрами out byte [], (или out struct)
Так что вам нужно сделать что-то похожее на это
[DllImport("FeeCalculation.dll", CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Ansi)]
public static extern void FeeCalculation(feeRequest cin,
out feeAnswer cout,
[MarshalAs(UnmanagedType.LPArray, SizeConst=100)]
out byte[] flimit,
[MarshalAs(UnmanagedType.LPArray, SizeConst=100)]
out byte[] frate,
[MarshalAs(UnmanagedType.LPArray, SizeConst=100)]
out byte[] fwindow,
[MarshalAs(UnmanagedType.LPArray, SizeConst=100)]
out byte[] fincrement,
[MarshalAs(UnmanagedType.LPArray, SizeConst=100)]
out byte[] fbird,
[MarshalAs(UnmanagedType.LPArray, SizeConst=100)]
out byte[] fparameter,
[MarshalAs(UnmanagedType.LPArray, SizeConst=100)]
out byte[] fvalidation,
[MarshalAs(UnmanagedType.LPArray, SizeConst=100)]
out byte[]fcoupon);
Вы можете не заботиться о других аргументах, но функция все еще будет пытаться записать их, поэтому вы должны предоставить фиктивные буферы, а буферы должны быть достаточно большими, чтобы содержать выходные данные. (поэтому вам может потребоваться изменить SizeConst).
Если ваша функция допускает указатели NULL на выходные данные, вы можете объявить значения, которые вам не нужны, как IntPtr
и передать для них IntPtr.Zero
.
В долгосрочной перспективе вам действительно нужно объявить все структур, которые эта функция хочет видеть, и передать их все должным образом.
Редактировать: хорошо, вы хотите использовать IntPtr или MarshalAs / byte [], но не оба одновременно.
public static extern void FeeCalculation(feeRequest cin,
out feeAnswer cout,
IntPtr flimit,
IntPtr frate,
IntPtr fwindow,
IntPtr fincrement,
IntPtr fbird,
IntPtr fparameter,
IntPtr fvalidation,
IntPtr fcoupon);
FeeCalculation(freq, out fans, IntPtr.Zero, ...