vvt 发表于 2017-2-1 14:00 感谢VVT的及时回复,再次感谢! 一开始我没能理解您的回复,不好意思, |
本帖最后由 vvt 于 2017-2-1 14:07 编辑 第一个问题,我已明确你想了解的是什么。所以我告诉你“不区分父子”,凡是使用到的 DLL(不管是父还是子) 都必须在“windows搜索DLL的搜索范围内”(搜索范围参考后面的问题) 也就是说,exe依赖dll(父),dll(父)再依赖dll(子)。与 exe直接依赖dll(子) 是一样的。windows都认为所有的dll,都是exe所依赖的。这些 dll 必须都被windows搜索到,才能正常使用这个 exe (debug文件夹或release文件夹,是exe所在路径,也是windows搜索范围的其中之一,也是最常用的dll存放地点) 第二个问题:装入 dll 是 windows 的事情,不是 c# 的事情。 第四个问题:可能 IMSL 后端又用到了 MKL。很多函数库都是有下一层的依赖的。 |
vvt 发表于 2017-1-26 11:00 感谢VVT的及时回复,祝您新春快乐! 学习了您的指导,受益匪浅! 可能是我提问中表达得不够清楚,部分回答不是我想了解的。 第一个问题中:我想确认的是“只要保证dll(父)在生成导出时无误,且其用到的dll(子)及其相关的dll放在Fortran中的DEBUG/RELEASE目录下就可以了。而不需要把dll(子)及其相关的dll复制到C#中的debug下(C#中EXE文件的目录)。”,是这样的吗? 第二个问题中:我想知道的是“周老师的教材说,Windows搜索要装入的DLL的顺序是dll(父)生成导出时搜寻dll(子)及其相关的dll的顺序还是C#调用dll(父)时搜寻dll(父)的顺序,或者都是?“ 第四个问题中:我用到了IMSL库,但是没有用MKL库,用depends分析时总提示mkl的一些链接库找不到。这难道是这两个函数库之间的有关联? |
第一个问题: Windows加载C#的exe时,就会加载所有使用到的dll(父)及dll(子) 加载时,不区分父子。因此,他们的加载规则是一样的。 第二个问题: 周振红教材里说的加载顺序并不完整。 其中缺少了 WinSxS , .Net framework , KnownDLLs 等(当然这些不太重要) 这个顺序是加载DLL的顺序(不区分父子,参考第一个问题) 第三个问题: fortcom 是 IVF 的一部分,它遇到了权限问题。 这个比较难说,你可以试试用管理员身份运行VS。如果依然有问题,可能是磁盘错误,导致IVF目录的NTFS权限信息丢失。尝试一下 chkdsk /f (这几乎不是fortran问题) 第四个问题: 会不会自动把所需的dll打包,取决于你的打包方式。 windows installer ? 还是 Wise ?InstallShielden?或者 NSIS ? 一般来说,需要自己写脚本(或配置)哪些文件需要打包。 推荐的方式是把所有所需的DLL(不区分父子)全部打包给用户。 实际上,你可以在很多常用的软件目录里找到很多编译器的运行时库,例如 borlandmm.dll msvcrt.dll 等等 第五个问题: 你说的导出dll是什么意思? 编译器在编译时,并不会检查所需的dll是否存在,只有运行时由windows检查。 depends(或同类软件)可以检查出来静态依赖的DLL(对于动态依赖的DLL也无法检查) 这不算是bug MKL的一部分DLL就属于动态依赖的(由Loadlibrary动态加载) 第六个问题: 导入库一般VC++才需要。fortran也可以用导入库。 这与dll的使用者有关(而不是dll的提供者) 事实上,没有导入库也没关系~~只要知道函数的接口(函数的定义),完全可以自己写一个只有接口,但没有内部实现的代码,编译之后,得到的导入库,与真实的导入库一样。 c# 的 DLLImport 实际上完成的,也是导入库的作用:“即:告知编译器函数的定义” c#是托管代码,所有DLL都是动态加载的。 |
捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )
GMT+8, 2024-5-6 23:08