【发布时间】:2012-04-11 00:18:04
【问题描述】:
这是我的挑战……
EXCEL-VBA 打开一个 COM-DLL,它在一个地方引用另一个 NET-DLL 中的类。当 COM-DLL 尝试从一个类(在 NET-DLL 中)初始化一个对象时,我收到一个错误,指出方法 get_ContentTypeProperties 没有实现。
error message "method [...] has no implementation"。
我从未创建过方法get_ContentTypeProperties,它也不是我正在使用的接口的一部分。
当通过另一个 DLL 访问 COM-DLL 时,为了解决 EXCEL-VBA,它可以正常工作。 有什么想法吗?
更新:使用与 NET-Dll 不同的类来实现 _Worksheet 接口(不是 _Workbook 接口,如原始问题)会带来相同的错误消息,但至少我发现“未实现”方法 (PrintOutEx) 是 Microsoft.Office.Tools.Excel 命名空间中工作表接口的一部分。这个接口由 Visual Studio 使用,我用它来创建我的 DLL。但仍然......我的 NET-DLL 正在 Microsoft.Office.Interop.Excel 命名空间中实现 _Worksheet-Interface。 为什么报告缺少我未实现的接口中的方法?
更新:
1.) 根据Process Monitor Results ,我看到正确的 DLL 已被寻址,并且 GAC 中加载的 DLL 没有干扰版本,例如
2.) 我 - 以防万一 - 让 Excel 引用 .NET-Framework 2.xxx,所有涉及的 DLL 都基于它......再次出现同样的错误:(
【问题讨论】:
-
这是一个 DLL Hell 问题,CLR 正在查找您的 DLL 的旧版本,它还没有实现 ContentTypeProperties 属性。您可以使用 fuslogvw.exe 进行故障排除,记录所有绑定。忘记重新注册程序集并且不使用 Regasm.exe /codebase 选项将其排除在 GAC 之外是触发此问题的好方法。
-
DLL Hell 可能是一个不错的选择,但是:它是与调用 COM-DLL 和调用 COM-DLL 的 Excel-Sheet 位于同一文件夹中的私有 NET-Assembly。经过几次试验,我很确定它是当前版本,但我即将创建一个示例项目。
-
CLR 没有理由在与 [ComVisible] 程序集相同的文件夹中查找依赖项。它不在探测路径中。这通常会生成运行时异常。无论您为帮助 CLR 找到程序集所做的一切都可能导致此问题。 Fuslogvw.exe 告诉你发生了什么,在你的问题中发布绑定日志。
-
@Regasm /codebase:它不会在 GAC 中注册 DLL,即 gacutil。它在注册表中存储 COM-DLL 信息并在需要时创建类型库(标志:tlb)。所以 Regasm.exe 它实际上是为 COM-DLLs 保留的
-
@FUSLOGVW:我的帐户上没有 FUSLOGVW.exe。复制它。向 regsvr32 \windows\system32\FUSLOGVW.exe 注册失败。只是执行给我带来了 GUI,但没有发生任何事情