【问题标题】:Consume a .NET Assembly from a classic ASP page从经典 ASP 页面使用 .NET 程序集
【发布时间】:2010-08-12 12:12:11
【问题描述】:

我有一个旧的 .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. 在项目属性下 一种。在 \application\assembly 信息下 一世。选中“使程序集 Com-Visible”。 湾。正在建设中 一世。勾选“注册 Com Interop”
  2. 请勿签名。
  3. 确保 IUSR 对该文件具有完全权限。
  4. 通过 iisreset 重新启动 IIS 以刷新所有缓存。

仍然没有成功运行应用程序。还有更多想法要检查或做什么吗?谢谢!

埃米尔

【问题讨论】:

  • 我有一个经典 ASP 应用程序,它通过 COM 包装器使用 .NET 程序集,并且经典 ASP 代码与您的相似。您是否已验证 strLogin 和 machineBuilding 已初始化?您是否从其他客户端执行了 objCommon.IsMachineAccount 以验证调用本身没有引发错误?
  • 谢谢梅奥。我尝试附加到 dllhost 并能够通过 asp 代码进行调试,是的,strLogin 有我的网络 ID 值;机器制造商将从调用中获得价值。我认为 asp 代码没有问题,因为我们在生产服务器上有一个工作版本。但是,我需要先让源代码在本地正常工作,然后才能提出更改请求。

标签: .net iis asp-classic regasm gacutil


【解决方案1】:

HRESULT 值非常相关。注意 0x80131500, 13 中的“设施代码”表示错误的来源是托管代码。你已经得到 1500 的友好翻译了。

换句话说,托管代码引发了异常并且没有得到处理。当然,这并不少见,托管代码通常会抛出异常。尤其是您触发的 NullReferenceException。调试这并不容易,因为您在非托管进程中运行托管代码。不太确定 IIS 的正确程序是什么,通常是使用工具 + 附加到进程完成的。解决这个问题的最好方法是隔离代码,编写一些单元测试。

除此之外,MachineBuilding 变量在我看来是 NRE 的一个很好的候选者。你没有初始化它。

顺便说一句:它与注册无关。这会产生一种非常不同的错误。

【讨论】:

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

我有一个类似于你的解决方案,但它早已不复存在。不过,我仍然有一些关于它的信息,我注意到我的 regasm 声明有所不同。

regasm mycomdll.dll /tlb :mycomdll.tlb

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

我还认为您应该仔细检查参数值,然后通过快速而肮脏的 .NET 客户端使用这些参数值调用方法,以查看该方法是否引发错误。

我还想确认我的 Classic ASP 代码与您的匹配...

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-23
      • 2011-12-29
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-12
      • 2016-08-12
      相关资源
      最近更新 更多