1. 如果函數只有傳入參數,比如:
C/C++ Code Copy Code To Clipboard//C++中的輸出函數int __declspec(dllexport) test(const int N){return N+10;}對應的C#代碼為:
C# Code Copy Code To Clipboard[DllImport("test.dll", EntryPoint = "#1")]public static extern int test(int m); PRivate void button1_Click(object sender, EventArgs e){textBox1.Text= test(10).ToString();}2. 如果函數有傳出參數,比如:
C/C++ Code Copy Code To Clipboard//C++void __declspec(dllexport) test(const int N, int& Z){Z=N+10;}對應的C#代碼:
C# Code Copy Code To Clipboard[DllImport("test.dll", EntryPoint = "#1")]public static extern double test(int m, ref int n); private void button1_Click(object sender, EventArgs e){int N = 0;test1(10, ref N);textBox1.Text= N.ToString();}3. 帶傳入數組:
C/C++ Code Copy Code To Clipboardvoid __declspec(dllexport) test(const int N, const int n[], int& Z){for (int i=0; i<N; i++){Z+=n[i];}}C#代碼:
C# Code Copy Code To Clipboard[DllImport("test.dll", EntryPoint = "#1")]public static extern double test(int N, int[] n, ref int Z); private void button1_Click(object sender, EventArgs e){int N = 0;int[] n;n = new int[10];for (int i = 0; i < 10; i++){n[i] = i;}test(n.Length, n, ref N);textBox1.Text= N.ToString();}4. 帶傳出數組:
C++不能直接傳出數組,只傳出數組指針,
C/C++ Code Copy Code To Clipboardvoid __declspec(dllexport) test(const int M, const int n[], int *N){for (int i=0; i<M; i++){N[i]=n[i]+10;}}對應的C#代碼:
C# Code Copy Code To Clipboard[DllImport("test.dll", EntryPoint = "#1")]public static extern void test(int N, int[] n, [MarshalAs(UnmanagedType.LPArray,SizeParamIndex=1)] int[] Z); private void button1_Click(object sender, EventArgs e){int N = 1000;int[] n, Z;n = new int[N];Z = new int[N];for (int i = 0; i < N; i++){n[i] = i;}test(n.Length, n, Z);for (int i=0; i<Z.Length; i++){textBox1.AppendText(Z[i].ToString()+"n");}}這里聲明函數入口時,注意這句 [MarshalAs(UnmanagedType.LPArray,SizeParamIndex=1)] int[] Z
在C#中數組是直接使用的,而在C++中返回的是數組的指針,這句用來轉化這兩種不同的類型.
關于MarshalAs的參數用法以及數組的Marshaling,可以參見這篇轉帖的文章: http://www.kycis.com/blog/read.php?21
5. 傳出字符數組:
C++定義:
C/C++ Code Copy Code To Clipboardvoid __declspec(dllexport) test(int i, double &a, double &b, char t[5])C#對應聲明:
C# Code Copy Code To Clipboard[DllImport("dll.dll", EntryPoint = "test")] public static extern void test(int i, ref double a, ref double b, [Out, MarshalAs(UnmanagedType.LPArray)] char[] t); 。。。 char[] t = new char[5]; test(i, ref a, ref b, t);字符數組的傳遞基本與4相似,只是mashalAs 時前面加上Out。
新聞熱點
疑難解答
圖片精選