当我使用类型库导入器将特定于.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方法?
答案 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应该实现相同的功能,但我不确定..