int CALLBACK PrintDiagnosticInfo(HWND, void (CALLBACK far *), LPARAM);
эта функция помещает в структуру данные. структура передается параметром с помощью указателя на пользовательскую функцию. Я пишу:
using System;
using System.Runtime.InteropServices;
namespace FP3530Printer
{
public delegate void Result(ref RetData rtd);
[StructLayout(LayoutKind.Sequential)]
public class RetData
{
public int Count;
public int CmdCode;
public int UserData;
public int Status;
public string CmdName;
public string SendStr;
public string Whole;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=6)]
public byte[] OrigStat;
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.LPStr, SizeConst = 20)]
public String[] RetItem; // массив указателей на нуль терминированные строки,
// в которые помещается результат выполнения команды
}
/// <summary>
/// Summary description for Class1.
/// </summary>
class Class1
{
public static void GetResult(RetData rtd)
{
Console.Write("{0}\n", rtd.CmdName);
}
[DllImport("FPL.dll")]
public static extern int PrintDiagnosticInfo(int hwd, Result res, long x);
[DllImport("FPL.dll")]
public static extern int InitFPport(int port, int speed);
[DllImport("FPL.dll")]
public static extern int CloseFPport();
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
try
{
Result _res = new Result(GetResult);
int i = InitFPport(1, 19200);
PrintDiagnosticInfo(0, _res, 0L);
}
catch(Exception e)
{
Console.Write("Error: {0}\n",e.Message);
}
CloseFPport();
Console.Read();
}
}
}
выдается ошибка
"Can not marshal field RetItem of type FP3530Printer.RetData: This type can not be marshaled as a structure field."