Если эта DLL действительно очень старая (еще тогда, когда char еще не подписан), то она может возвращать строки. Это довольно маловероятно, просто объявите их как байты:
[DllImport("blah.dll")]
private static extern noidea DrfGetFirmwareVersion(IntPtr handle,
out byte major, out byte minor, byte address);
Там, где «noidea», по-видимому, недействителен, или какой-то код ошибки типа int. Еще одна вещь, о которой стоит беспокоиться, это свойство DllImport.CallingConvention, это может быть Cdecl. Используйте это, когда вы получаете предупреждение MDA о дисбалансе стека. И не забудьте установить Platform Target вашего проекта на x86, иначе он будет бомбить на 64-битных операционных системах.