c# - 已成功注册 COM DLL - 一个可访问,一个不可访问

标签 c# .net dll com dispatcher

我们有 2 个以相同方式为 .NET 3.0 构建的 COM DLL - 一个从数据库中获取数据的 - 从网络服务获取数据的

我们一直使用 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 Automation 错误。 所以看起来 DLL 已正确注册,但由于某种原因它无法在 DLL 中实例化我的类。

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

最佳答案

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

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

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

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

也可能是程序本身的问题,例如:

  • 实现类是否非公开ComVisible
  • 实现类没有公共(public)默认构造函数
  • 程序集中的静态构造函数抛出异常
  • 实现类的实例构造函数抛出异常

我假设前两个不是这里的问题,但也许您的类(class)正在尝试访问测试服务器上的某些资源但失败了?

关于c# - 已成功注册 COM DLL - 一个可访问,一个不可访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12840329/

相关文章:

c# - Json.net反序列化,子属性为空时作为数组出现

c# - 将 2 个对象添加到列表

c# - NAudio效果不起作用,并且在不同的声卡上的行为不同

c++ - 是否有像 Dependency Walker 这样可以在 Windows CE 6.5 移动设备上运行的工具?

c# - 找不到类型或命名空间 AppServiceConnection

c# - MVVM 模式中是否应该只有一个 ViewModel 类?

c# - ASP.NET:多个程序集版本,相同的 Web 应用程序

.net - 为什么将 Int32 转换为 Float64 会导致数据更改?

c - 64 位版本的 DLL 在内存空闲时崩溃; 32位没有

c# - 不同的模拟对象来比较单元测试中的对象