前两章我们是利用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:MiloLu2015vsC#csDllcsDllinDebugcsDll.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:MiloLu2015vsC#csDllcsDllinDebugcsDll.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.
谢谢.