zoukankan      html  css  js  c++  java
  • C#获取C++中修改过的float数组(指针),dll

    C++中

    struct rankPoint{
        float sim;
    };
    
    extern "C" __declspec(dllexport) int getRank(rankPoint prank[20000]){    
        for(int i = 0; i < 20000; i++)
        prank[i].sim = 0;
    
        for(int i = 0; i < 7; i++)
        prank[i].sim = i;
        return 0;
    }

    C#中

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Runtime.InteropServices;
    
    
    namespace DllTest
    {
        [StructLayout(LayoutKind.Sequential)]
        struct rankP
        {
            public float mark;
        }
        public class Cpp {
            [DllImport("Cdll.dll")]
            public static extern int getRank(IntPtr p);
        }
        public partial class _Default : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                int size = Marshal.SizeOf(typeof(rankP)) * 20000;
                byte[] bytes = new byte[size];
                IntPtr pBuff = Marshal.AllocHGlobal(size);
                rankP[] rBuf = new rankP[20000];
                Cpp.getRank(pBuff);
                for(int i = 0; i < 20000; i++)
                {
                    IntPtr pPointor = new IntPtr(pBuff.ToInt64() + Marshal.SizeOf(typeof(rankP)) * i);
                    rBuf[i] = (rankP)Marshal.PtrToStructure(pPointor,typeof(rankP));
                }
                int si = 0;  //设置断点监测,的确修改了rBuf数组,也就是实现了数组的传递,只不过是通过结构体实现的
                Marshal.FreeHGlobal(pBuff);
            }
        }
    
    }

     转一篇简单易懂的C++编写dll的文档http://wenku.baidu.com/view/ebb7e1edb8f67c1cfad6b867.html

  • 相关阅读:
    设计模式之四 代理模式
    设计模式之四 建造者模式
    设计模式之三 模板模式
    设计模式之二 工厂模式
    如何使用Json-lib
    Java LoggingAPI 使用方法
    设计模式之一 单例模式
    Scrapy教程
    Scrapy简介
    Scrapy安装向导
  • 原文地址:https://www.cnblogs.com/Key-Ky/p/3405060.html
Copyright © 2011-2022 走看看