c的dll定义:
int _stdcall ReSet(int* Status,int WaitTime);
其中Status为返回一个状态。
-----------------------------------------------
查了资料,有二种方式:
1.int* ->out int 
2.int*-> ref int 
----------------
在c#里两种方式都试过,但都提示找不到reset入口。另外在vb中是这样定义的:
Public Declare Function ReSet Lib "PCBDll.dll" (ByRef Status As Long, ByVal WaitTime As Long) As Long,并且运行正常。那C#中有什么特别的情况吗?请大家帮助。

解决方案 »

  1.   

    char* getStr();[DllImport("xxx.dll")]
    public static extern string getStr();
      

  2.   

    在C#中使用指针要用 unsafe 关键字,并且使用 /unsafe 编译器选项进行编译。
      

  3.   

    unsafe int ReSet(int* Status, int WaitTime); 在命令行编译时使用 /unsafe 编译器选项:csc.exe /unsafe Program.cs
    或:在 Visual Studio 开发环境中设置 unsafe 编译器选项1. 打开项目的“属性”页。
    2. 单击“生成”属性页。
    3. 选中“允许不安全代码”复选框。
      

  4.   

    [DllImport("PCBDll.dll")]
    unsafe public static extern int ReSet(int* Status, int WaitTime); unsafe void Foo()
    {
      int status;
      ReSet(&status, 60);
    }
      

  5.   

    难道是IntPtr?貌似就是托管指针类型~
      

  6.   

    指针类型要用IntPtr吧。
    C#里我比较不喜欢用unsafe的东西。
      

  7.   

    如果dll你自己可以修改,你c的dll没有正确输出函数名称,要加上extern,实在不行要用def文件输出你的函数名字,比如如下
    int extern _stdcall ReSet(int* Status,int WaitTime); 在C#中,声明要如下,使用ref int
    [DllImport("PCBDll.dll")]
    public static extern int ReSet(ref int Status, int WaitTime); 
    在调用时也要用上ref关键字
    ReSet(ref sts, wt);
      

  8.   

    学习一下,调用过dll,好在dll没使用指针
      

  9.   

    ref 是地址传值。GOGOGO的回答是正确的。 
      

  10.   

    已经安装你这种方法试过了,还是提示找不到。
    unsafe void Foo()
    {
      int status;
      ReSet(&status, 60);//到这句的时候依然提示。
    }
    郁闷!
      

  11.   

    LZ,你按楼上的方法DllImport并声明DLL内的函数了吗?
      

  12.   

    重写了已经,
    DllImport("PCBDll.dll")]
    unsafe public static extern int ReSet(int* Status, int WaitTime); 
    然后还修改的unsafe的编译。还是不行啊
      

  13.   

    晕,可以了,是大小写的原因。
     ReSet-->我写成Reset了。
    唉,结帐了,谢谢各位啊。