How do export "DPI-C" task call sequence?

In reply to birdluo:

I faced the similar problem recently. I did the following for it.

package dpi_seq_pkg;
  import "DPI-C" context task C_Program();
  export "DPI-C" task sv_write;
  export "DPI-C" task sv_read ;

  int    Addr, Data;
  enum   {WRITE, READ} kind;
  event  cmd_start, seq_done;

  task sv_write(input int A, D);
    kind = WRITE; Addr = A; Data = D;
    ->cmd_start;
    @(seq_done);
    return;
  endtask : sv_write

  task sv_read(input int A, output int D);
    kind = READ; Addr = A;
    ->cmd_start;
    @(seq_done);
    D = Data;
    return;
  endtask : sv_read

endpackage : dpi_seq_pkg
task DPI_sequence::body()
  fork
    // C Program
    dpi_seq_pkg::C_Program();

    forever
    begin : program_rendering
      wait (dpi_seq_pkg::cmd_start.triggered);
      if(dpi_seq_pkg::kind == dpi_seq_pkg::WRITE)
      begin
        agent_write_sequence  api_wr_seq = agent_write_sequence::type_id::create("api_wr_seq");
        api_wr_seq.Addr = dpi_seq_pkg::Addr;
        api_wr_seq.Data = dpi_seq_pkg::Data;
        api_wr_seq.start(m_sequencer, this);
      end
      if(dpi_seq_pkg::kind == dpi_seq_pkg::READ)
      begin
        agent_read_sequence   api_rd_seq = agent_write_sequence::type_id::create("api_rd_seq");
        api_rd_seq.Addr = dpi_seq_pkg::Addr;
        api_rd_seq.start(m_sequencer, this);
        dpi_seq_pkg::Data = api_rd_seq.Data;
      end
      -> dpi_seq_pkg::seq_done;
    end // Program_rending

  join_any

  disable : fork;
  .
  .
  .
extern "C" void sv_write(int, int  );
extern "C" void sv_read (int, int *);
extern "C" void C_Program(void)
{
  int * RDATA;
  sv_write( 20, 5);
  sv_write(100,15);
  sv_read (20, RDATA);
  cout << "  RDATA : " << RDATA << endl;
  return;
}

How do you think about this way?