【问题标题】:Deploying .NET COM dll, getting error (0x80070002)部署 .NET COM dll,出现错误 (0x80070002)
【发布时间】:2010-03-24 23:24:35
【问题描述】:

我有一个 .NET COM 程序集,我正试图将其部署到 Web 服务器(IIS 6 Win 2003)。我们已成功将此程序集部署到我们的测试环境,但生产环境无法正常工作。

正在从经典 ASP 页面调用程序集。每次该页面尝试使用“Set LTMRender = CreateObject("LTMRender.Render")”初始化程序集时,我都会收到错误“Error Type:, (0x80070002)”。

此错误似乎表明权限被拒绝,或文件未找到类型问题。

我创建了一个测试应用程序来查看程序集是否在网页之外工作。 .exe 初始化程序集,然后进行设计为失败的调用,从而导致程序集生成日志文件。如果我在与程序集相同的文件夹中运行 .exe,它可以工作,但如果我在其他地方运行它会失败。

由于某种原因,无法从其文件夹外部访问程序集。

我不明白为什么这不起作用。我已经确认的事情:

  • 部署文件夹具有足够的权限。
  • 我们已确认安装程序集的文件夹对所有必要的用户帐户具有正确的权限。
  • 程序集使用强名称签名,并已使用 regasm.exe C:_WebSites\LTMRender\LTMRender.dll /codebase /tlb:C:_WebSites\LTMRender\LTMRender.tlb 注册。 Regasm 报告成功。
  • 程序集的属性和相关 GUID 设置正确。

有什么建议吗?

编辑

我们对我的 testapp.exe 运行了 filemon,它似乎表明了问题所在。当 testapp.exe 在 D:_websites\DocWebV2\ 或 D:_websites\DocWebV2\ LTMRender\ 文件夹中运行时,它成功并且 filemon 显示 D:_websites\DocWebV2\LTMRender\pinPDF.dll SUCCESS

如果我在 D:_websites\DocWebV2\Client 中运行我的 testapp.exe – 我的 asp 页面在其中运行,它会显示 D:_websites\DocWebV2\pinPDF.dll NAME NOT FOUND 然后 D:_websites\DocWebV2\pinPDF\未找到 pinPDF.dll 文件

如果它仅在此特定文件夹下,我不确定为什么它没有在正确的文件夹中查找。

【问题讨论】:

  • 到目前为止,您的分析听起来正确 - 看起来像是文件系统权限问题。我建议您使用 procmon 或 filemon(免费的 sysinternals 工具)来跟踪权限问题。从外部目录运行您的测试应用程序。您将能够清楚地看到文件系统权限失败。

标签: .net com assemblies


【解决方案1】:

如果是 File Not Found,不是权限问题。 7 表示 Windows 错误,2 表示 ERROR_FILE_NOT_FOUND。 COM 可见组件的常见问题是 Windows 或 CLR 无法找到相关的 DLL。但这应该会产生不同的错误代码。在源代码中查找问题,尝试在不使用文件完整路径名的情况下打开文件。服务器上的工作目录会有所不同。解决此问题的最佳方法是使用调试器。

【讨论】:

  • 我无法在生产环境中运行调试器。我相信这不是 .dll 试图写出文件或类似的东西的问题。我的编辑概述了我对此的最新信息。似乎正在加载 .dll(根据 Filemon),但它使用的依赖项没有。它在我运行 testapp.exe 的文件夹中查找依赖项,而不是在我的 .dll 所在的文件夹中查找依赖项。
  • 好吧,正如我所提到的,这是设计使然。您可以通过将程序集存储在 GAC 中或将非托管 DLL 存储在 PATH 上的目录中来解决它。
【解决方案2】:

发现了这个问题。不完全确定我理解它,但我确实让它工作。特别感谢 nobugz 让我专注于路径。

Filemon 显示在我们的测试环境中发现了一个依赖(托管 .NET).dll,但在生产环境中没有。

关键是在生产中我们的网络团队选择部署到不同的文件夹然后进行测试,所以我们有:

产品
D:_Websites\DocWebV2\LTMRender
测试
D:_网站\LTMRender

当我将 TEST 更改为使用与 PROD 相同的文件夹结构时,问题是可重现的。

我的程序集是一个 COM .dll,因为它已注册而被发现。依赖的 .dll 未注册,因此 windows 正在执行整个检查 GAC,然后是 PATH 文件夹,然后是正在执行的进程文件夹,但没有找到它。

我一直认为“执行进程文件夹”是 .dll 文件夹(因为它调用了依赖的 .dll),但看起来网页是执行进程。

现在我不明白为什么要检查 D:_Websites\LTMRender。它不在我们的 PATH 中。我假设 IIS 正在对此进行处理,因为 d:_WebSites 是其中所有 Web 设置的根文件夹。我不是 IIS 方面的专家,所以我只是假设它以某种方式控制它。

【讨论】:

    猜你喜欢
    • 2012-05-18
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    相关资源
    最近更新 更多