在c#中调用DELPH编写的DLL的函数时,老是出现未将对象引用到实例的错误: 
delphi编写的dll中函数声明:function   DeliverfromEsm(var   Smtype,   Content,Caller:pchar):integer; 
我在c#中声明: 
[DllImport("EsmApi.dll",CharSet       =       CharSet.Ansi,CallingConvention       =       CallingConvention.StdCall)] 
static   extern   int   DeliverfromEsm(ref   string   smtype,ref   string   content,ref   string   caller); 
调用: 
string   smtype=""; 
string   content=""; 
string   caller=""; 
int   reportval=DeliverfromEsm(   ref   smtype,ref   content,ref   caller); 
出现未将对象引用到实例的错误,请问我该如何正确调用?

解决方案 »

  1.   

    那位delphi比较熟悉的,说一下,我该在delphi中怎么正确调用啊
      

  2.   

    function       DeliverfromEsm(var       Smtype,       Content,Caller:pchar):integer;
    -----------------
    var去掉
      

  3.   

    请问,加var和不加有什么区别?
      

  4.   

    问一下这个是否是一个委托中用到的?如果是,那pchar这里就不可以用string了,因为他们的实际接口长度不一样的。如果不是,那string应该OK,有问题,就找找可能是这个dll内部的问题了
      

  5.   

    dll是人家提供的,联系不到相关技术人员了,但他们提供的delphi可执行文件,调用正常。可惜的是,没有源码
      

  6.   

     声明:   
      function   Test(var   nParam1:   integer;   var   nParam2:   PChar):   Integer;   Stdcall;External'api.dll';   
      调用:   
      p1,p2:pchar;   
      nPa2:   integer;   
      r:   integer;   
      nPa1:array[0..20000]   of   char;   
        
      p1   :=   nPa1;   
      r   :=   Test(nPa2,p1);   
    在delphi调用成功,我在c#中这么声明调用:
    [DllImport("EsmApi.dll",CharSet   =   CharSet.Ansi,CallingConvention   =   CallingConvention.StdCall)]
    static extern int Test( ref int buffercount,   byte[] buffer);
    int buffercount=-1;
    //StringBuilder buffer=new StringBuilder(20000);
    byte[] buffer=new byte[20000];
    int reportval=Test(ref buffercount, buffer);//执行会在这行报错,提示:未将对象引用到实例
    buffer参数我用StringBuilder 得到一样的结果,都报错。各位,帮忙看看