部署.NET COM DLL,获取错误(0x80070002)

时间:2010-03-23 15:02:57

标签: .net com assemblies

我有一个.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文件未找到

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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被检查。它不在我们的路径中。我假设IIS正在做这件事,因为d:_WebSites是那里所有网页设置的根文件夹。我不是IIS的专家,所以我只是假设它以某种方式控制它。