【问题标题】:IDispatch parameters passed from Delphi to C#从 Delphi 传递给 C# 的 IDispatch 参数
【发布时间】:2010-07-08 06:34:36
【问题描述】:

我正在使用 Delphi 2010 使用 Hosting CLR in Delphi 中描述的技术访问存储在 Visual Studio 2008 中编写的 C# 程序集中的对象。这些技术确实有效,我能够获得一个 .NET 类的实例——通过一个接口——并调用它的方法并读取它的属性。只要参数是简单的参数,例如字符串、整数、字符和布尔值,调用这些方法就可以正常工作。但是,如果我尝试传递一个作为 IDispatch 引用的参数,C#/.NET 代码只会将该参数视为空值。

与 Delphi 中的 Hosting CLR 示例的一个不同之处在于我没有在 Delphi 和 C# 中手动定义接口。相反,我在 Delphi 2010 中将接口类型库编写为 RIDL 文件。然后我将该 RIDL 文件编译为 TLB 文件,然后使用 Microsoft 的 TLBIMP.EXE 从 DLL 构建 COM/Interop DLL,然后添加引用到 C# 项目中的那个 DLL。我使用这种方法来定义 COM 对象的接口,用于接口使用(如在 Delphi 中托管 CLR 中所述)以及定义作为参数传递的 IDispatch 接口的接口。

这是我在 Delphi 中使用的接口,也是我使用的 C# 类实现的接口(.NET 元数据):

[TypeLibType(4160)]
[Guid("C4D342E4-62A0-4049-BF1E-9F2A6EE19E5E")]
public interface ITestInterface
{
    [DispId(203)]
    int Run(object Test);
}

Delphi 可以启动 CLR,然后实例化一个实现 ITestInterface 的 C# 对象。 Delphi 可以调用 Run,我可以验证 Run 是否正确执行。返回值与预期一致,如果我传递“对象测试”以外的参数(重写接口),则可以正确看到这些参数。但是,当我为 Test 接口传递对 IDispatch 对象的引用时,C# 代码仅将其视为 NULL。尝试使用“as”将参数转换为正确的接口不会失败 - 但它会导致 NULL,因为初始值似乎是 NULL。

我已经仔细检查过,当它离开 Delphi 时该值不为 NULL。

我猜我必须在 C# 端执行某种额外的编组步骤才能正确获得 IDispatch 对象支持的接口。

任何想法,建议将不胜感激。

【问题讨论】:

  • 我发现了我的问题。在 C# 收到 IDispatch 参数后,由于早期准备步骤,它将其设置为 NULL。所以,这整件事只是我没有注意代码和正确调试。

标签: c# visual-studio-2008 delphi com delphi-2010


【解决方案1】:

CLR 不知道如何处理原始接口指针且没有类型信息。您需要传递 VT_DISPATCH 类型的 VARIANT。这将映射到 C# 端的 __ComObject,需要后期绑定才能对该引用进行调用。

【讨论】:

  • 这种方法有效,但旧方法也有效。无论是通过了 IDispatch 还是 Varient,我仍然可以 QueryInterface 来获取正确的接口。
  • C# 语言中的“旧方法”是什么?
猜你喜欢
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
相关资源
最近更新 更多