从经典ASP页面调用.NET程序集

3
我有一个旧的.NET 2005网站,其中包含一些ASP页面,并且在访问.NET dll时遇到了对象引用问题。这个维护任务被交给了我,但原始开发人员已经不知去向了:( 我已经开始使用.NET,但我并不真正掌握处理这种dll混乱的问题。
在下面的箭头处,我遇到了"(0x80131500)对象引用未设置为对象的实例"的错误。
Set objCommon = Server.CreateObject("Wrapper.CommonFunctions")
  Dim machineBuilding
--->>>  If objCommon.IsMachineAccount(strLogin, machineBuilding) Then

我已经按照以下步骤操作:

  1. regasm /tbl /codebase mycomdll.dll
  2. gacutil /i mycomdll.dll
  3. 将mycomdll.dll复制到System32目录中
  4. 从控制台中执行issreset命令
  5. 如果您的dll是在framework 2.0创建的,请在system32目录中创建一个"dllhost.exe.config"文件并添加以下内容:

<?xml version="1.0"?> <configuration> <startup> <supportedRuntime version="v2.0.50727"/> <requiredRuntime version="v2.0.50727"/> </startup> </configuration>

6.- 使用issreset命令重新启动IIS

还有以下操作:

  1. 在项目属性下 a. 在\application\assembly信息下 i. 勾选“使程序集可见”。 b. 在build下 i. 勾选“注册Com互操作性”
  2. 不要对其进行签名。
  3. 确保IUSR对该文件拥有完全权限。
  4. 通过iisreset重启IIS以刷新任何缓存。

但仍然无法成功运行应用程序。还有更多的想法可以检查或做吗?谢谢!

Emir


我有一个使用COM包装器通过.NET程序集消耗的Classic ASP应用程序,而且Classic ASP代码与你的类似。你已经验证了strLogin和machineBuilding是否被初始化了吗?你是否从不同的客户端执行了objCommon.IsMachineAccount来验证调用本身没有抛出错误? - Mayo
谢谢Mayo。我尝试连接到dllhost并能够通过asp代码进行调试,是的,strLogin具有我的网络ID值;机器构建将从调用中接收该值。我认为asp代码没有问题,因为我们在生产服务器上有一个可工作的版本。但是,在我能够提出更改请求之前,我需要先让源代码在本地正常工作。 - Emirage
3个回答

2
HRESULT值非常重要。请注意0x80131500中的“facility code”,13表示错误源于托管代码。您已经获得了1500的友好翻译。
换句话说,托管代码抛出了异常,并且未处理。当然,托管代码通常会抛出异常,特别是NullReferenceException,这是您触发的异常。调试这并不容易,因为您正在未经管理的进程中运行托管代码。对于IIS,不太确定正确的过程是什么,通常使用“工具+附加到进程”完成。解决此问题的最佳方法是隔离代码,编写一些单元测试。
除此之外,MachineBuilding变量似乎是NRE的一个很好的候选者。您没有初始化它。
顺便说一下:这与注册无关。那会产生非常不同的错误。

从来没有想到 HRESULT 中的信息可以被分解以隔离错误(而不是将特定错误映射到特定问题)。+1 只是因为向我展示了新东西。此外,如果您有任何提供更多关于 HRESULT 解释的链接,那就太棒了。 - Mayo
在http://blogs.msdn.com/b/heaths/archive/2005/07/21/441391.aspx上找到了信息。该设施(位8-15等于19)是FACILITY_URT,我后来发现这意味着通用运行时,这是CLR的早期名称。非常有趣的东西 - 我喜欢学习新事物。 :) - Mayo
@Mayo:在SDK头文件WinError.h中查找有关此问题的详细信息。对于VS2008,请查看c:\program files\microsoft sdks\windows\v6.0a\include。 - Hans Passant

0
问题在于应用程序正在寻找一个包含数据库主机名的文件。

0

我曾经有一个类似于你的解决方案,但现在早已不复存在。然而,我仍然保留了一些相关信息,并且注意到我的regasm语句与你的不同。

regasm mycomdll.dll /tlb :mycomdll.tlb

你的引用是tbl而不是tlb - 或许这就是问题所在?

我认为你应该仔细检查参数值,然后通过一个简单粗暴的.NET客户端使用这些参数值调用方法,看看是否会抛出错误。

我还想确认一下我的经典ASP代码是否与你的匹配...

set obj = server.CreateObject("mycomdll.myclass")
...
call obj.method(false)
...
myvar = obj.method2(param1, param2, param3)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接