当前位置:编程学习 > C#/ASP.NET >>

c#调用dll结构体怎么只返回一组数据

type tpumpings1 = record
    time, proppant,
      liquidrate,
      liquidvolumea,
      proppantmassa, fracturehalf,
      fracturew: double;
  end;
  arrpump = array of tpumpings1;这是delphi写的dll的结构体
function teststring(out data1:arrpump;out datastrv:variant): integer; stdcall;
var
  i: integer;
  datastr: arraystring;
begin
  result := 0;
  setlength(data1, 5);
  for i := 0 to 4 do
  begin
    data1[i].time := (i + 1) * 10;
    data1[i].proppant := (i + 1) * 9;
    data1[i].liquidrate := (i + 1) * 8;
    data1[i].liquidvolumea := (i + 1) * 7;
    data1[i].proppantmassa := (i + 1) * 6;
    data1[i].fracturehalf := (i + 1) * 5;
    data1[i].fracturew := (i + 1) * 4;
  end;该函数的部分代码。。。

public partial class Form1 : Form
    {
        [StructLayout(LayoutKind.Sequential)]
        public struct tpumpings1
        {
            [MarshalAs(UnmanagedType.R8)] 
            public double time;
            [MarshalAs(UnmanagedType.R8)] 
            public double proppant;
            [MarshalAs(UnmanagedType.R8)] 
            public double liquidrate;
            [MarshalAs(UnmanagedType.R8)] 
            public double liquidvolumea;
            [MarshalAs(UnmanagedType.R8)] 
            public double proppantmassa;
            [MarshalAs(UnmanagedType.R8)] 
            public double fracturehalf;
            [MarshalAs(UnmanagedType.R8)] 
            public double fracturew;
        }
        [DllImport("recordtest.dll")]
        public static extern int teststring(out tpumpings1[] data1, out object datastrv);
  
    

        public Form1()
        {
            InitializeComponent();
        }

        private void buttonClick_Click(object sender, EventArgs e)
        {
            tpumpings1[] data1= new tpumpings1[5];
            object aa;
            if (teststring(out data1, out aa) == 1)
            {
                int a = data1.Length;
                MessageBox.Show("调用成功!"+a+"");
            }
        }
    }[code=csharp]
 结果只返回一组,应该是5组数据啊,求大神指教 dll c# delphi --------------------编程问答-------------------- 从代码看,data1.Length无论怎样都是5吧 --------------------编程问答-------------------- 没看出哪里不对,调试下看看 --------------------编程问答-------------------- 但是出来之后就是1啊。。。 --------------------编程问答--------------------
引用 2 楼 ssp2009 的回复:
没看出哪里不对,调试下看看

--------------------编程问答-------------------- 用byte[]

然后序列化 --------------------编程问答--------------------
引用 5 楼 wawd74520 的回复:
用byte[]

然后序列化

再详细点儿么。。。 --------------------编程问答-------------------- 封装类型。序列化成byte[]     比如  前几位表示什么   中间几位表示什么   后面几位表示什么

c++里直接用

然后c++返回的时候也按这个格式


c#反序列化就就按这个格式分割


这种方法应该不会错了 


--------------------编程问答--------------------
引用 7 楼 wawd74520 的回复:
封装类型。序列化成byte[]     比如  前几位表示什么   中间几位表示什么   后面几位表示什么

c++里直接用

然后c++返回的时候也按这个格式


c#反序列化就就按这个格式分割


这种方法应该不会错了

你觉得问题是出在这个dll的函数过程中嘛?这是个delphi编写的dll。是不是跟我的c#调用过程关系不大? --------------------编程问答--------------------
引用 8 楼 zaccheo_z 的回复:
引用 7 楼 wawd74520 的回复:封装类型。序列化成byte[]     比如  前几位表示什么   中间几位表示什么   后面几位表示什么

c++里直接用

然后c++返回的时候也按这个格式


c#反序列化就就按这个格式分割


这种方法应该不会错了
你觉得问题是出在这个dll的函数过程中嘛?这是个delphi编写的dll。是不是跟我的……



如果不能改dll

那你就用byte[]接收

然后手动解析试试   

看是不是都返回了 


如果少返回  那就是你传参数和他的没对齐


你可以找找百度找找c#和delphi对齐方式 --------------------编程问答--------------------
引用 9 楼 wawd74520 的回复:
引用 8 楼 zaccheo_z 的回复:引用 7 楼 wawd74520 的回复:封装类型。序列化成byte[]     比如  前几位表示什么   中间几位表示什么   后面几位表示什么

c++里直接用

然后c++返回的时候也按这个格式


c#反序列化就就按这个格式分割


这种方法应该不会错了
你觉得问题是出在这个dll的函数过程中嘛?这……
谢谢,我试试 --------------------编程问答-------------------- 继续求助。。。 --------------------编程问答-------------------- 继续求助求助
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,