创建DLL的两个疑难问题
Muf 2004-01-06 05:57:36 问题描述:
使用VC7.1创建DLL,其代码必须使用非托管的库,并且包装给托管程序使用。
在程序中使用了非托管的全局类(含有析构函数);在托管代码中需多次调用new创建非托管结构。
1. 在VC7.1中,MSDN建议修改链接选项,以使用/NOENTRY,据说是因为DllMain有某种局限性,有可能使DLL不能正确运行。其警告信息为:
LINK : warning LNK4243: 包含用 /clr 编译的对象的 DLL 在链接时没有使用 /NOENTRY;映像可能无法正确运行
请问,为什么映象可能无法正确运行,在什么情况下会不正确运行?
2. 使用MSDN的建议进行修改,使用手动调用__crt_dll_initialize()和__crt_dll_terminate()函数;但在使用中发现,当在托管函数中调用new来创建非托管结构时,会出现StackOverflow例外!!(new int则不会),这是什么原因,应该如何解决?
同样的代码,在不按建议(即不使用/NOENTRY编译选项)时,不会出问题。