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;
}

你可能感兴趣的:(import)