这很纠结。
我已经获得了一个用经典ASP编写的网站,其中很多幕后工作都是通过Server.ObjectCreate()实例从ASP页面调用的VB6 COM +对象中完成的。对于这个版本,VB6例程已经转换为VB.NET,只需在其上运行Visual Studio 2003转换器工具,然后将该解决方案文件升级到VS 2008.因此,有一千零一个可能的错误来源。
其中一个给我带来麻烦的VB6模块按以下格式清除了一堆Response Cookie:
ASPResponse.Cookies("SysUserCode") = ""
ASPResponse定义为:
Private ASPResponse As ASPTypeLibrary.Response
并通过以下方式设置了对象激活:
Set ASPResponse = objContext("Response")
在这个模块的VB.NET转换中,这些行变为
ASPResponse = ContextUtil.GetNamedProperty("Response")
和
ASPResponse.Cookies("SysUserCode")() = ""
(注意额外的一对括号。不是很多VB人,我不确定该语法是什么意思。)
好的,这是一个问题:当这个代码在我的机器上执行时,该行给出了VB错误13,其中Error.Description为“指定的强制转换无效”。咦?什么演员?
顺便说一下,这个模块在同事机器上运行良好,他看不出我的机器配置和他的相关组件有什么不同。
我在这里完全不知所措。谷歌搜索它给了我一些关于VB.NET cookie或VB.NET的COM组件的东西,但没有任何与经典ASP cookie相关的东西。
答案 0 :(得分:1)
时...
Private ASPResponse As ASPTypeLibrary.Response
Set ASPResponse = objContext("Response")
... 发布 VB.NET转换?如果是这样,您需要将objContext("Response")
显式转换为ASPTypeLibrary.Response
对象。如果启用了Option Strict
,这尤其适用。 e.g。
ASPResponse = CType(objContext("Response"), ASPTypeLibary.Response)
此外,VB.NET不支持 Set 和 Let 语句。
答案 1 :(得分:0)
这可能与COM组件的主机激活方式有关。我读了另一篇文章([Klaus H. Probst])1,表明为了访问Response元素,COM组件必须作为库(而不是Server)激活,以便它运行在ASP进程空间。所以我尝试将Component的托管应用程序的Activation类型更改为库,重置和重建几次,现在我能够访问Response的Cookies元素。但是,我的同事仍在将主机应用程序作为服务器运行,并且没有问题。