【问题标题】:Tlbimp Failed Generating Interop DllTlbimp 无法生成互操作 Dll
【发布时间】:2014-06-20 09:10:35
【问题描述】:

我在 Delphi 中开发了一个 COM 库。当我尝试在 Visual Studio 项目中“添加引用”时,VS 崩溃。我尝试通过 tlbimp.exe 构建互操作程序集,但失败了:

TlbImp : 错误 TI1000 : 类型库导入器遇到一个 意外异常:System.AccessViolationException - 试图 读或写受保护的内存。这通常表明其他 内存已损坏。

有趣的是,当我向 Web 应用程序(或网站)项目“添加引用”时,它成功生成了 Interop dll 并添加了引用。

了解 Web 应用程序项目如何使用 tlbimp.exe 对我来说很重要,因为我想自定义互操作生成。

【问题讨论】:

  • 试试开源的TlbImp,可以调试:clrinterop.codeplex.com/releases/view/17579
  • @Noseratio 这是个好主意。当 TlbImp 尝试使用函数 DISPID 检索函数描述时,我调试了代码并发现了访问冲突。我没有足够的时间准确地发现问题,但可能是 TlbImp 中的错误。
  • 我想你能做的最好的事情(除了reporting a bug)是尝试改变你的Delphi组件的界面,所以它不会扰乱TlbImp。
  • @Noseratio 我将在收集到足够的信息来重现该错误后立即报告该错误。该问题仅针对一个 CoClass。其他接口和 CoClass 都很好。

标签: c# delphi com com-interop tlbimp


【解决方案1】:

您的 Delphi 代码很可能有错误。你可以像这样在 Delphi 中调试 COM 库:

选择运行->参数...

(不要介意这里说的是 project28.exe;它对 Projectx.dll 的工作方式相同)

我通常使用 COM 为 Excel 开发插件。
在这种情况下,我的主机应用程序是Excel.exe

输入此信息后,您将能够运行库。
当您这样做时,Delphi 将启动主机应用程序并等待它以某种方式调用您的库。
如果您设置了任何断点,Delphi 将暂停操作并允许您进行调试。

因为您知道在 C# 代码中调用了哪些函数,所以应该不难看出在哪里设置第一个断点。

Delphi 也会中断任何异常。

【讨论】:

  • @John,我使用(非 dotnet)主机应用程序测试和调试了我的 COM 库。当我“添加引用”到 dotnet 应用程序时,会出现我的问题。无法添加引用,因为甚至没有生成 Interop dll。
  • 尝试在 Delphi 中导入库(您创建的 dll)。如果可行,那么也许您可以使用 Delphi 在 C# 中在该过程中生成的文件。
  • @John,我使用的是 Delphi XE 而不是 Delphi Prism。所以我认为 Delphi 不会生成任何对 C# 有用的文件。我说的对吗?
  • 不确定,但你会知道 type-lib 是否可导入。 B:或者可以用工具把Delphi文件翻译成C#能理解的文件,C:或者直接将Delphi文件导入C#。
  • 一定是 tlbimp.exe 中的 bug
猜你喜欢
  • 2011-02-09
  • 2012-08-06
  • 2022-01-22
  • 1970-01-01
  • 2014-08-10
  • 2019-11-03
  • 2019-08-02
  • 2010-10-01
  • 1970-01-01
相关资源
最近更新 更多