1

我们有 2 个 COM DLL,它们的构建方式与 .NET 3.0 相同 - 一个从数据库获取数据 - 一个从 Web 服务获取数据

我们一直使用 RegAsm.exe 使用以下命令注册 DLL:

cd "C:\Program Files\Dispatcher\COM\Custom" C:\Windows\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe MercatorRepositoryCOM.dll /tlb:MercatorRepositoryCOM.tlb /codebase C:\Windows\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe MercatorUtilitiesCOM.dll /tlb:MercatorUtilitiesCOM.tlb /codebase

这适用于我们的大多数服务器(Win2008R2 32b)

在我们最新的服务器上,输出显示:注册成功。但是,应用程序可以访问 MercatorUtilitiesCOM.dll,但不能访问 MercatorRepositoryCOM.dll。

我们尝试使用 RegAsm、regsvr32、regtlibv12 注册 DLL,甚至将它们添加到 GAC。没有任何效果。

有什么办法比“(10092) ActiveX 自动化:服务器无法创建对象。”更好地解决这个问题?有没有其他方法可以尝试注册这些 DLL?

我们尝试将日志记录添加到 DLL 代码中,但从未写入日志,因此我们可以假设 DLL 甚至没有被调用。

PS:我们别无选择,只能将这些作为 COM DLL 公开,因为我们有一个基于 VB6 的扫描/索引应用程序需要引用这些。它是 Dispatcher(对于那些可能知道它的人)。

更新:经过进一步调查,看起来 DLL 可能已经正确注册。当我们取消注册它时,我们会收到一条明确的消息,即 Dispatcher 找不到 DLL 引用。当我们注册它时,Dispatcher 打开,然后抛出 ActiveX 自动化错误。因此,似乎 DLL 已正确注册,但由于某种原因,它无法在 DLL 中实例化我的类。

解决方案:这个问题毕竟与 DLL 注册无关。显然,启动 Dispatcher 的应用程序发生了一些内部变化。它曾经将其作为子进程生成,因此它可以使用相同的 app.config,但他们将其更改为作为单独的进程运行(它是自己的可执行文件)。这意味着它无法在 app.config 中找到我们的配置和端点。我们为新的可执行文件创建了一个单独的 app.config 并且它可以工作。感谢你的帮助!

4

2 回答 2

4

正如@WhozCraig 建议的那样,您可能还有其他一些与 COM 注册无关的问题。这发生在一个全新的测试服务器上的事实强烈地证明了您忘记安装的其他一些依赖项,它被失败的组件使用,而不是另一个。我会比较两者之间的程序集引用并检查您看到的任何差异。

另一个简单的测试是使用depends.exe或直接调用LoadLibrary将您的dll 加载到新的测试服务器上。由于它是托管程序集,因此可能不会产生任何结果,但很容易尝试。

接下来,您可能想尝试在测试服务器上运行程序集绑定日志查看器(fuslogvw.exe),以查看程序集是否尝试引用其他程序集并失败。基本方法是运行查看器,单击设置并切换到“将失败记录到磁盘”,并可选择清除任何现有日志。现在运行加载 COM 对象失败的程序,重现失败,并在日志查看器中刷新列表。如果您看到一个新条目,那可能是罪魁祸首。

我经常用于诊断这些错误的最后一个也是最强大的工具是procmon,当您的应用程序尝试加载不工作的 COM DLL 时,您将在测试服务器上运行它。这将向您显示测试服务器上的程序正在执行的所有文件、注册表和网络访问,因此我可能会使用过滤来仅显示加载 DLL 的程序的输出。通常,您要查找的是由于文件未找到或访问被拒绝而失败的文件或注册表访问。您可能会看到很多实际上不是问题的 File Not Found 错误,但请密切注意在应用程序报告错误之前出现的最后一个错误。

程序集本身也可能有问题,例如:

  • 实现类是非公开的或不是ComVisible
  • 实现类没有公共默认构造函数
  • 程序集中的静态构造函数引发异常
  • 实现类的实例构造函数抛出异常

我认为前两个不是这里的问题,但也许你的班级正试图访问测试服务器上的某些资源并且失败了?

于 2012-10-11T13:28:21.253 回答
1

毕竟这个问题与 DLL 注册无关。显然,启动 Dispatcher 的应用程序发生了一些内部变化。它曾经将其作为子进程生成,因此它可以使用相同的 app.config,但他们将其更改为作为单独的进程(它自己的可执行文件)运行。这意味着它无法在 app.config 中找到我们的配置和端点。我们为新的可执行文件创建了一个单独的 app.config 并且它可以工作。

于 2012-10-12T13:20:15.690 回答