【发布时间】: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 解决程序集解析问题。