zoukankan      html  css  js  c++  java
  • C# 调用C++的dll,通过DllImport方式。 from http://www.cnblogs.com/xiaokang088/archive/2011/04/08/2009673.html

    C# 调用C++的dll,通过DllImport方式。

    以下例子包含以下几种参数传递方式:

    传递string、Int、Int数组、结构体、结构体数组。

    比较懒,没写注释,呵呵,各位辛苦了。

    demo在这里

    C++ Dll 如下:

    // dllmain.cpp : Defines the entry point for the DLL application.
    #include "stdafx.h"
    #include <stdio.h>
    #include <tchar.h>
     
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
                         )
    {
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
        }
        return TRUE;
    }
     
    struct PersonInfo
    {
        int id;
        wchar_t name;
    };
     
     
    struct StudentInfo
    {
        int id;
        wchar_t name[100];
    };
     
     
    int Add(int para1,int para2)
    {
        return para1+para2;
    };
     
    int TestStruct(struct PersonInfo* person)
    {
        person->id=10;
        return 0;
    };
     
    int TestStructArray(struct  PersonInfo   persons[5] )
    {
        persons[0].id=11;
        persons[0].name = L'a';
     
        persons[1].id=22;
        persons[1].name = L'b';
     
        persons[2].id=33;
        persons[2].name = L'c';
     
        persons[3].id=44;
        persons[3].name = L'd';
     
        persons[4].id=55;
        persons[4].name = L'e';
     
        return 0;
    };
     
    int TestStructArray2(struct  StudentInfo   students[3] )
    {
        students[0].id=11;
        wcscpy(students[0].name,L"aaaaaaa");
         
        TCHAR szMsg[200] = {0};
        _stprintf_s(szMsg, 200, _T("size of PersonInfo2:%d"), sizeof(StudentInfo));
        ::OutputDebugString(szMsg);
     
        students[1].id=22;
        wcscpy(students[1].name,L"bbbb");
     
        students[2].id=33;
        wcscpy(students[2].name,L"ccc");
     
        return 0;
    };
     
     
     
     
    int TestIntArr(int tt[5])
    {
        tt[0]=0;
        tt[1]=1;
        tt[2]=2;
        tt[3]=3;
        tt[4]=4;
     
        return 0;
    }
     
    int TestString(LPTSTR buffer, DWORD size)
    {
        wcscpy_s(buffer,size,L"eststsetwet");
        return 0;
    }

    C++ def文件如下:

    LIBRARY "Win32Dll"
     
    EXPORTS
         Add
         TestStruct
         TestStructArray
         TestStructArray2
         TestIntArr
         TestString

    C# 调用代码如下:

    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            Loaded += new RoutedEventHandler(button1_Click);
        }
     
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            int num1 = 0, num2 = 0;
            if (!string.IsNullOrEmpty(textBox1.Text) && !string.IsNullOrEmpty(textBox2.Text))
            {
                num1 = Convert.ToInt32(textBox1.Text);
                num2 = Convert.ToInt32(textBox2.Text);
     
                int ret = DllTest.Add(Convert.ToInt32(textBox1.Text), Convert.ToInt32(textBox2.Text));
                textBlock3.Text = ret.ToString();
            }
     
            PersonInfo p = new PersonInfo();
            DllTest.TestStruct(ref p);
     
            //int dd = p.id;
     
            int[] intArray = new int[5];
            DllTest.TestIntArr(intArray);
            Debug.WriteLine(intArray);
     
            PersonInfo[] ps = new PersonInfo[5];
            DllTest.TestStructArray(ps);
     
            int t = Marshal.SizeOf(new StudentInfo());
            //  var t = sizeof(PersonInfo2);
     
            StudentInfo[] ps2 = new StudentInfo[3];
            DllTest.TestStructArray2(ps2);
     
            short[] name = ps2[0].name;
            string ret13 = new string(name.Where(o => o != 0).Select(o => (char)o).ToArray());
     
            char[] chars = new char[100];
     
            StringBuilder builder = new StringBuilder(256);
            DllTest.TestString(builder, 256);
        }
     
    }
     
     
    public class DllTest
    {
        [DllImport("Win32Dll.dll", EntryPoint = "Add")]
        public static extern Int32 Add(int a, int b);
     
        [DllImport("Win32Dll.dll", EntryPoint = "TestStruct")]
        public static extern Int32 TestStruct(ref PersonInfo person);
     
        [DllImport("Win32Dll.dll", EntryPoint = "TestStructArray")]
        public static extern Int32 TestStructArray([In, Out]  PersonInfo[] persons);
     
        [DllImport("Win32Dll.dll", EntryPoint = "TestStructArray2")]
        public static extern Int32 TestStructArray2([In, Out]  StudentInfo[] students);
     
        [DllImport("Win32Dll.dll", EntryPoint = "TestIntArr")]
        public static extern Int32 TestIntArr([In, Out] int[] intArray);
     
        [DllImport("Win32Dll.dll", EntryPoint = "TestString")]
        public static extern Int32 TestString([MarshalAs(UnmanagedType.LPTStr)]StringBuilder buffer, Int32 length);
    }
     
    [ComVisible(false), StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct PersonInfo
    {
        public int id;
        public char name;
    }
     
    [StructLayout(LayoutKind.Sequential)]
    public struct StudentInfo
    {
        public int id;
     
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)]
        public short[] name;
    }
  • 相关阅读:
    element 步骤条steps 点击事件
    element-ui的rules中正则表达式
    从master分支创建自己的分支
    2.1 系统调用io实现原理
    2-3形参和实参
    2-2函数
    2-1.编译和链接
    linux高编信号-------setitimer()、getitimer()
    linux高编IO-------有限状态机编程原理(mycpy)
    linux高编线程-------线程同步-条件变量
  • 原文地址:https://www.cnblogs.com/songtzu/p/2799576.html
Copyright © 2011-2022 走看看