前兩章我們是利用c#調用c++編寫的動態庫,這一章我們說一下,如何用C#創建動態庫並實現調用。
其實,c#創建dll和創建class類是一個道理,只不過dll是class庫的集合。
所以我們創建工程一個class Libary類型工程 New project --- Class Libary , 這里工程命名為:csDll,這個也是我們生成動態庫文件名稱。
接着我們添加我們的加減乘除運算算法:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace csDll 8 { 9 public class Class1 10 { 11 /// c='+': addition,c='-':subtraction,c='*':multiplication,c='/':division 12 public double Calculation(double a, double b, char c) 13 { 14 double result; 15 switch (c) 16 { 17 case '+': 18 result = a + b; 19 break; 20 case '-': 21 result = a - b; 22 break; 23 case '*': 24 result = a * b; 25 break; 26 case '/': 27 if (b != 0) 28 { 29 result = a / b; 30 } 31 else 32 { 33 result = 0; 34 } 35 break; 36 default: 37 result = 0; 38 break; 39 } 40 return result; 41 } 42 } 43 }
編譯后,我們將得到我們的csDLL.dll文件
緊着我們來實現應用程序調用這個動態庫函數算法。
同樣,我們以我們的上一章的應用程序作為修改,添加dll至工程內:
接着導入路徑:
[DllImport(@"F:\MiloLu\2015\vs\C#\csDll\csDll\bin\Debug\csDll.dll")]
接着同樣是申明函數入口名稱,這里和之前一樣,可以保持不變: public static extern double calculat(double a, double b, char c);
唯一不同的是,我們調用c#創建生成的dll需要實例對象后才可以使用其內的對象入口函數,即:
csDll.Class1 exampleDll = new csDll.Class1(); 之后我們就可以使用這個對象進行訪問其內的入口函數了:
代碼:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Runtime.InteropServices; namespace WpfControls { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { [DllImport(@"F:\MiloLu\2015\vs\C#\csDll\csDll\bin\Debug\csDll.dll")] public static extern double calculate(double a, double b, char c); csDll.Class1 exampleDll = new csDll.Class1(); public MainWindow() { InitializeComponent(); } private void Click_submiit(object sender, RoutedEventArgs e) { try { double a = Convert.ToDouble(m_edit1.Text); double b = Convert.ToDouble(m_edit2.Text); char c = Convert.ToChar(m_edit4.Text); double result =exampleDll.Calculation(a, b, c); m_edit3.Text = result.ToString(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void Click_clean(object sender, RoutedEventArgs e) { m_edit1.Text = m_edit2.Text = m_edit3.Text = "0"; m_edit4.Text = "+"; } } }
編譯運行,我們實現了同樣的效果:
End.
謝謝.