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;
}
posted @ 2012-12-03 14:29  songtzu  阅读(324)  评论(0编辑  收藏  举报