【问题标题】:.net activex dll works only if in same folder as application (VB6) consuming it.net activex dll 仅在与使用它的应用程序 (VB6) 位于同一文件夹中时才有效
【发布时间】:2012-08-01 05:35:44
【问题描述】:

我们有一个用 C# 构建的 ActiveX DLL; DLL 用于 VB6 应用程序(它也将被经典 ASP 应用程序使用)。

DLL 是一个 C# 类库项目,带有

  • 源代码中的类和接口 Guids 属性
  • 项目中与 COM 相关的属性/设置
  • 源代码中的 progid 属性

所有显然都正确设置。

证明是,我们已经使用 regasm /codebase /tlb:xxxxx 注册了 DLL,并且 VB6 dev env 可以在引用窗口中看到 COM 对象。

将 COM DLL 引用添加到项目后,Intellisense 工作并看到一切正常,应用程序编译正确。

问题在于,如果我们不将 DLL 的副本与已编译的应用程序 exe 文件放在同一文件夹中,则在尝试实例化 DLL 中的类的实例时会失败;返回的错误是“系统找不到指定的文件”。 如果 DLL 的副本与应用程序 exe 位于同一位置,则一切正常。

我发现了对类似问题的引用,但没有关于如何解决的提示或线索。

马里奥

【问题讨论】:

  • 您确定没有在虚拟化注册表位置注册程序集吗?我希望如果你将它转储到 app 文件夹中,VB6 运行时会在适当的位置注册它。因此,您将拥有该文件的两个副本,每个副本都为不同的用户和/或用户令牌注册。
  • 谢谢,但这发生在 Windows XP 上,我不确定其中是否涉及注册表虚拟化...作为一个奇怪的更新,即使在 IIS/Classic ASP 中一切都运行良好,甚至虽然 DLL 文件与 w3wp.exe 不在同一个文件夹中...
  • 这不是 VB6 错误消息。 C# DLL 依赖于什么?它将需要在自己的 bin 文件夹中的所有依赖 DLL。如果不是,它会给出类似的错误。
  • 除了一些标准的 .net 框架 (4.0) 程序集之外,该 DLL 没有任何外部引用。
  • 如果程序集没有任何依赖关系,则不是典型问题。使用 Fuslogvw.exe 解决程序集解析问题。

标签: .net dll com vb6 activex


【解决方案1】:

首先,VB6 仅将 TypeLib 用于智能感知,因此这并不能证明关于 DLL 的任何内容。

我建议你使用ProcessMonitor,找到here来监控加载VB6 dll的过程。确保它不在 app 文件夹中,将其保存在您注册的位置。您将能够看到注册表查找以定位路径,以及搜索路径时的文件 IO。

如果不能解决问题,请发回结果。

【讨论】:

  • 关于您的第一个注释,Intellisense 工作的事实至少意味着 tlb 格式正确,并且 regasm 可以正确映射 tlb 文件中的接口和类...感谢 processmonitor 提示
  • @mabian69 哦,是的,绝对的。但是,如果错误基本上是找不到文件,那么我试图指出 VB6 智能感知中涉及的唯一文件是 tlb。您可以从系统中完全删除 dll 并仍然获得智能感知。老实说,据我所知,你所做的一切都是 100% 正确的。当一切都完美但仍然无法正常工作时,我拔出了 ProcMon。
【解决方案2】:

在 VB6 中,如果您使用 RegAsm 并且未将程序集放在 GAC 中,则它必须与正在执行的应用程序位于同一目录中,除非您在 RegAsm'ing 文件时使用 /Codebase 选项。

【讨论】:

    猜你喜欢
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    相关资源
    最近更新 更多