领测软件测试网
q0n0h"?"zRD
w软件测试技术门户M;R2O4Y?ga
M软件测试技术门户EO%F,r@s%tuAC返回页首
o)E'z\(j.M!z为什么 dllexport 不能始终适用
-Mb.B| a!zCq#UV(Qtn L-IR1vVc(L使用 __declspec(dllexport) 有它自己的缺陷。当您有两个映射(DLL 或 exe)都为托管映射,但通过 dllexport 而不是通过 #using 公开功能时,dllexport 的问题就会暴露。因为 dllexport 是一个本机构造,所以每次使用 __declspec(dllexport) 跨 DLL 边界调用时,都会先引发从托管到本机的转换,再引发从本机到托管的转换。这样就难以获得很好的性能。
`+j-X$RK软件测试技术门户M~-JZ'kK
kFT]解决这种性能问题的选择很有限。没有简单的“开关”可以立刻让 __declspec(dllexport) 成为对托管代码没有相关 thunk 的构造。推荐的修复办法是将导出的功能包装在一个托管类型(引用或值类/结构)中,导入程序再通过导出 DLL 上的“#using”访问该类型,从而直接访问导出 DLL 中的功能。通过这种更改,当从托管客户端调用这段托管代码时就不需要进行转换。图 8 中对此做了说明,其中 A 部分显示了与使用 __declspec(dllexport) 相关的成本,B 部分显示了使用 #using 和将函数包装在 .NET 类型中所带来的优化。这种方法的一个潜在问题是导出 DLL 的非托管导入程序不能对 DLL 的功能进行 __declspec(dllimport)。这在进行更改之前应该加以考虑。
U,p+}6Enw.DlT7Y_(`F(]!hm软件测试技术门户nxWC?m$An:uQ S/r#ix图 8 降低 Thunk 成本
F{&u!vH{2X7[;L%j)w&c^ `'mIDp