您的位置:首页 > 编程语言 > C#

从代码都发布遇到的问题总结(C#调用非托管dll文件,部署项目)

2012-06-30 12:49 951 查看
0 前言 

 应老板的要求,写一个二维码生成软件。从后台条码生成(C\C++语言),到前天界面(winform)。期间遇到不少问题,这里打算把整个流程及遇到的问题一一分享,给初学者一个从源码到客户可以安装运行有一个整体的感性认识,同时给继续在C#调用非托管动态链接库Dll及部署时提示找不到dll而出错的后来者提供参考。

1、条码生成

  该部分采用C、C++混合写的。原本是有main()函数,可以测试运行的。保存图片用到了opencv的库函数,这点可要注意了,再发布部署整个程序要一同包括用到的opencv的库。在VC++6.0 上,将用到的接口封装了一下并导出dll库。

2、界面

  根据dll接口及需求用C# winform 做了个界面。在界面程序中调用dll文件时遇到了问题。

2.1 C#如何调用非托管dll

  具体的可参加网上的例子。主要说明如下:

  a.[DllImport(dllname)]声明必须时必须指明调用入口EntryPoint(具体属性设置参加网络资源),该声明放在欲调用的函数前面,如果该dll中导出了多个函数入口,需要对每个函数分别声明。

  b.C\C++和C#之间的类型转换问题。这个问题在dll声明待调用函数时,要求已经转为为C#的变量类型。比如在C++正const char*,在这里要转为为string等。具体网络资源。

  c.找不到*.dll文件。这是C#调用非托管dll最常见的问题了。可能的原因之一,就是dll声明函数类型不匹配,具体解决如上述b中的介绍。原因之二,dll文件放置位置的问题。具体分析如下:

DLL文件必须位于程序当前目录或系统定义的查询路径中。(.exe所在位置;system32下;添加引用;实验所得,对于非托管只能放在system32下才有效果,具体分析见下文。)

        DLLImport会按照顺序去查找DLL文件(程序当前目录>System32目录>环境变量Path所设置路径)。

        返回类型变量、方法名称、参数列表一定要与DLL文件中的定义相一致。

注:首先需要确认引用了哪些组件?哪些是托管的?那些是非托管的?托管的很方便,直接被使用的需要引用,间接使用的需要拷贝到Bin目录下。非托管的就特殊处理(实际上你拷贝到bin是没有任何作用的,因为CLR会把文件拷贝到一个临时目录下,然后在那运行Web,而CLR只会拷贝托管文件,这就是为什么把非托管的DLL放到bin目录下仍然提示找不到该模块)。解决方案:首先在服务器上建立一个新建的目录,假设是(C:\ProgramDir\WinDLL\).然后在环境变量中,给Path变量添加这个目录,最后把非托管的DLL文件都拷贝到该目录下。或者更干脆把DLL放到System32目录中。对于自己部署的应用程序,这样的确能很好的解决问题。然而如果我们用的是虚拟空间,我们有没有办法吧注册Path变量或者把我们自己的DLL拷贝System32目录下

3 打包部署

  具体参见:http://blog.163.com/cgz2010@126/blog/static/168179141201132402919175/

      http://blog.163.com/huhenggang@126/blog/static/113852947201132194469/

4 部署安装  

    常见问题是找不到dll文件。在第2部分“如何调用非托管dll”时已近做了说明,而将所需的dll放大system32下,运行还是出错提示找不到dll。这是可能的原因是你添加的dll文件还依赖其他dll文件,所以请用相关工具分析该dll文件的依赖,然后一同拷贝到system32下即可。我是这样解决的。

参考:/article/6992470.html

  /article/1689032.html

  http://topic.csdn.net/u/20100804/09/9f1b108c-b760-4814-9620-8b40ef08b85e.html

  http://topic.csdn.net/u/20120220/13/ded0ad81-8ee9-40cc-8b66-ceccf546a1df.html

  http://hi.baidu.com/sppeivan/item/885d37d9083875ef55347f31
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: