• C# 通过dllImport 调用C++ Dll 小总结


    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;
        }
    
  • 相关阅读:
    Python Redis 五大数据类型
    Python 魔法方法
    Python 静态方法,类方法,属性方法
    Python 反射
    Python 中 封装,继承,多态
    Redis 事务
    Redis 哨兵集群
    装饰器,迭代器,生成器
    Flume与kafka集成
    hbase 可视化工具 HBaseXplorer---HbaseGUI
  • 原文地址:https://www.cnblogs.com/xiaokang088/p/2009673.html
Copyright © 2020-2023  润新知