.net类型由类型库中的IUnknown替换

时间:2016-06-15 08:34:52

标签: c# .net delphi delphi-xe4

当我使用类型库导入器将特定于.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方法?

2 个答案:

答案 0 :(得分:3)

这完全是预料之中的。 SqlTransaction类型是.net类型,COM接口不知道。在这种情况下,你怎么能指望其他方(Delphi程序)能够获得.net SqlTransaction类型的实例。

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

答案 1 :(得分:1)

也许你应该首先获得Interop代理对象,通常在visual studio项目中导入一个由ide自动完成的类型库,我认为Delphy应该实现相同的功能,但我不确定..