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; }
轉載自:http://www.cnblogs.com/xiaokang088/archive/2011/04/08/2009673.html |