【问题标题】:.net types replaced by IUnknown in type library.net 类型被类型库中的 IUnknown 替换
【发布时间】:2016-06-15 08:34:51
【问题描述】:

当我使用类型库导入器将特定于 .net dll 的 tlb 文件导入 Delphi 时,接受特定于 .net 类型参数的方法被 IUnknown 替换。 当我想从我的 Delphi 客户端应用程序调用这样的方法时,我想传递一个 SQLTransaction 类型的参数值。我如何实现这一目标?我是否需要将所有 .net dll 方法参数更改为从 .net 特定类型继承的用户定义类型?

我在导入 .net tlb 时也导入了 mscorlib_TLB.pas。

.net方法

public class MyConnection : IDisposable
{    
    public int BulkInsert(SqlTransaction tran);
    {...}
}

Delphi中导入tlb的方法:

_MyConnection = interface(IDispatch)
    ['{9FB088F8-1033-3A99-B9C6-C7D7D2D40140}']    
    function BulkInsert(const SQLTransaction: IUnknown): int; safecall;
end;
  CoMyConnection = class
    class function Create: _MyConnection;
    class function CreateRemote(const MachineName: string): _MyConnection;
  end;

如何从我的 Delphi 客户端应用程序调用 BulkInsert 方法?

【问题讨论】:

    标签: c# .net delphi delphi-xe4


    【解决方案1】:

    这完全是意料之中的。 SqlTransaction 类型是 .net 类型,您的 COM 接口未知。你怎么能期望其他方,在这种情况下是一个 Delphi 程序,能够获得 .net SqlTransaction 类型的实例。

    您的 COM 接口需要限制自己仅使用 COM 类型。您需要将SqlTransaction 替换为COM 接口。解决这个问题的一种方法是声明一个 COM 接口,它公开了SqlTransaction 的必要功能。然后在您的 C# 代码中通过将实现委托给SqlTransaction 的实例来创建一个实现此接口的类型。然后公开一个允许实例化包装器接口的方法。在 Delphi 方面,消费者将实例化您的包装接口并将其传递给BulkInsert。当然,您将更改 BulkInsert 以接受包装接口而不是 SqlTransaction 作为其参数。

    【讨论】:

    • 感谢您的确认。这正是我所害怕的,并且是“我需要将所有 .net dll 方法参数更改为从 .net 特定类型继承的用户定义类型吗?”。我认为这个问题可能有更好的解决方案。
    • 如果你不需要从消费者端调用 .net 类型的任何方法,你的包装接口甚至可以是IUnknown。换句话说,您可能不需要做太多事情。
    • 我是第一次处理 COM 互操作。可能这是一个愚蠢的问题。我不需要在 .net 类型上调用任何方法。我想创建一个实例并将其传递给 IUnknown 参数。 TObject 的实例是否会作为参数工作,而 .net dll 是否会将其视为 SqlTransaction 的实例?
    • 你不能在 Delphi 端创建它的实例。您必须在 C# 端执行此操作。在这一点上,你为什么需要传递它。请记住,我们所能看到的只有一个界面和一个功能。我们没有上下文。
    • 好的,我明白了。对不起,不完整。接口中还有其他方法共享事务对象。换句话说,许多使用不同方法的操作在一个 SqlTransaction 中完成。
    【解决方案2】:

    也许你应该首先获取Interop代理对象,通常在Visual Studio项目中导入类型库它是由IDE自动完成的,我认为Delphy应该实现相同的功能,但我不确定..

    【讨论】:

    • 第二段代码确实是Delphi IDE导入类型库的结果
    • 我想,你应该看看 Delphy 是否与互操作对象兼容,我想是的,但我不确定.. 否则你可以搜索为 deplhi C# 项目转换类型库
    • 什么代理对象?我们这里只有SqlTransaction,它没有作为 COM 对象公开。
    • IDE(或支持类型库-互操作转换的框架)自动创建的互操作代理对象
    • 另见与prevoius回答链接相关的问题:stackoverflow.com/q/5834100/3762855
    猜你喜欢
    • 2010-09-19
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多