从代码都发布遇到的问题总结(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
应老板的要求,写一个二维码生成软件。从后台条码生成(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
相关文章推荐
- 从代码都发布遇到的问题总结(C#调用非托管dll文件,部署项目) 转
- C#调用C++代码遇到的问题总结
- 遇到问题----java----myeclipse或者eclipse发布的项目时配置文件不更新或者无配置文件
- 使用C#.net调用非托管DLL遇到的问题
- maven构建项目自动部署到tomcat中遇到的各种sb问题总结
- SSH项目部署weblogic遇到的问题总结
- 遇到问题----java----myeclipse或者eclipse发布的项目时配置文件不更新或者无配置文件
- WebLogic使用总结(五)——Web项目使用Sigar在WebLogic服务器部署遇到的问题
- maven构建项目自动部署到tomcat中遇到的各种sb问题总结
- springboot项目配置多环境打包部署遇到的问题总结
- 【tool】项目中遇到的代码中的文件路径问题
- Axis 2 整合到 SSH 项目,Axis2 整合,Axis2 发布,Axis2 部署方法及遇到问题
- idea 下部署web项目遇到问题总结
- [项目过程中所遇到的各种问题记录]学习篇——对工作以来的学习过的开源项目进行总结—动软代码生成工具
- maven构建项目自动部署到tomcat中遇到的各种sb问题总结
- asp.net c#.net项目中使用总结,遇到的各个问题的汇总
- WebLogic使用总结(五)——Web项目使用Sigar在WebLogic服务器部署遇到的问题
- VS2013发布web项目到IIS上遇到的问题总结
- maven构建项目自动部署到tomcat中遇到的各种sb问题总结
- tomcat下发布项目,遇到的问题总结