2010-03-23 107 views
1

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

从传统的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集。

任何提示?

编辑

我们跑的Filemon对我testapp.exe,它似乎已经表明问题是什么。当testapp.exe在D:_websites \ DocWebV2 \或D:_websites \ DocWebV2 \ LTMRender \文件夹中运行时,它会成功并且filemon显示为D:_websites \ DocWebV2 \ LTMRender \ pinPDF.dll SUCCESS

如果我运行testapp .exe在D:_websites \ DocWebV2 \客户端 - 我的asp页面运行,它显示D:_websites \ DocWebV2 \ pinPDF.dll名称未找到,然后D:_websites \ DocWebV2 \ pinPDF \ pinPDF.dll文件未找到

我不知道为什么它不在正确的文件夹中,如果它只在这个特定的文件夹下。

+0

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

回答

1

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

+0

我无法在生产中运行调试器。我相信,这对于试图编写文件或者类似文件的.dll来说并不是问题。 我的编辑概述了我的最新信息。似乎.dll(根据Filemon)正在加载,但它使用的依赖关系不是。它正在从我运行testapp.exe的文件夹中寻找依赖项,而不是我的.dll所在的文件夹,这是它们的位置。 – Bremer 2010-03-23 19:37:14

+0

好吧,就像我刚才提到的那样,这是设计。您可以通过在GAC中存储程序集或在PATH目录中的非托管DLL中解决此问题。 – 2010-03-23 19:56:00

1

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

Filemon显示在我们的测试环境中找不到产品的依赖(托管.NET).dll。

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

PROD
d:_Websites \ DocWebV2 \ LTMRender
TEST
D:_Websites \ LTMRender

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

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

我总是假定“正在执行的进程文件夹”将是.dll文件夹(因为它调用依赖.dll),但看起来网页是正在执行的进程。

现在我不明白的是为什么D:_Websites \ LTMRender被检查。这不在我们的PATH中。我假设IIS正在做这件事,因为d:_WebSites是那里所有Web设置的根文件夹。我不是IIS的专家,所以我只是假设它以某种方式控制着它。