C# 调用C++的dll,通过DllImport方式。 from http://www.cnblogs.com/xiaokang088/archive/2011/04/08/2009673.html
C# 调用C++的dll,通过DllImport方式。
以下例子包含以下几种参数传递方式:
传递string、Int、Int数组、结构体、结构体数组。
比较懒,没写注释,呵呵,各位辛苦了。
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; } |