[学习记录]使用C#语言调用.dll(动态链接库)文件

不可全信

感谢各位博客教会了我很多,我也要写出来参与社区建设.

嘛不一定完全正确,想要可靠性比较高的同志建议买书,书中出处啥的比较详细,可靠性比较高.

---------------------

1.基本步骤

  1.1 向项目中导入dll文件

  1.2 阅读dll文件的使用手册 [ 和头文件(.H) ]

  1.3 编写导入dll文件中方法的代码

  1.4 编写读取dll中对应数据的代码(可能略)

  1.5 写方法调用dll中方法并加以判断调用是否成功

  1.6 在相关位置调用使用自己定义的调用方法

2.基本实现:

  2.1 向项目中导入dll文件

    复制dll文件(ctrl+c) > 打开vs项目对应处粘贴(ctrl+v)

  2.2 阅读dll文件的使用手册 [ 和头文件(.H) ]

    打开: 双击PDF等类型的使用手册  || 右键打开方式使用记事本打开头文件(||直接用vs打开)

    查阅:定义+函数列表+函数说明等     ||  功能+输入+输出+返回值

  2.3 编写导入dll文件中方法的代码

    例子:

      [DllImport("lib/NAME.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, EntryPoint = "Open")]
      public static extern int Open(int a, int b);

    解读:

      [ ]:特性,为程序集添加额外说明信息的文件   (详情搜索:C#特性)

        DllImport: dll文件导入(import)  

     // EntryPoint:设置调用函数的名字,若没有,extern后的名字作为默认的函数名
      // ChartSet:传送字符串数据的字符集,Ansi,默认值,会影响文本参数的封送处理;Auto:可以使CLR根据当前操作系统使用适当的字符集,Unicode:基于Window NT,并只支持Unicode,就用Unicode

         // SetLastError:是否遇到任何错误都应传送,通过调用Mashell.GetWin32Error()方法检查可用性
      // CallingConvention:StdCall:由被调用都清理栈资源,调用native函数时的默认方式;

    (来自一起实习的小伙伴,是的就是你,没错就是我)

    模式:

      [DllImpor("详情搜路径/.dll"),详情搜DllImpor参数]

        public static extern 返回值类型 方法名(参数类型 参数名);

        详细用法拓展等暂略,请自行搜索

    解疑:

      (为纸上谈兵者)

       方法和参数 参考上一步的手册和头文件编写即可

    参考:

      [链接]C#调用C++生成的DLL,并返回结构体引用或者结构体指针多个值

 

  2.4 编写读取dll中对应数据的代码(可能略)

    可能用到结构体,新建类将获取数据的属性写入

    dll为C++,现在用C#的可参考:[链接]C#调用C++dll,C++中char*与C#类型的对应关系

                  [链接]C#调用C++ dll时,结构体引用传参的方法

  2.5 写方法调用dll中方法并加以判断调用是否成功

    善用if-else等,结合手册编写

    接收返回值数据并对其进行判断等

  2.6 在相关位置调用使用自己定义的调用方法

    对照手册,利用手册使用方法,注意使用顺序等 

    

3.细节处理

  3.1 向项目中导入dll文件

    注意:  ① 右键属性||选中>视图>属性窗口;

                           ② 始终复制; 如图:

       

    避免出现此错误(在路径写正确了的情况下):[链接]无法加载 DLL“lib/xxx.dll

  3.2 编写导入dll文件中方法的代码

    注意:  如果手册等中传入参数为指针类型等,要注意C#语言中的数据类型与其它语言数据类型的转换

         例如此处C++与C#:[链接]数据类型转换

猜你喜欢

转载自www.cnblogs.com/xm1998/p/12179185.html