.net 类型在类型库中被 IUnknown 替换
.net types replaced by IUnknown in type library
当我使用类型库导入程序将特定于 .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 方法?
也许你应该先获取 Interop 代理对象,通常在 visual studio 项目中导入类型库是由 ide 自动完成的,我认为 Delphy 应该实现相同的功能, 但我不确定..
这完全可以预料。 SqlTransaction
类型是 .net 类型,您的 COM 接口未知。您怎么能期望其他方(在本例中为 Delphi 程序)能够获得 .net SqlTransaction
类型的实例。
您的 COM 接口需要限制自己只使用 COM 类型。您需要将 SqlTransaction
替换为 COM 接口。解决该问题的一种方法是声明一个 COM 接口,它公开 SqlTransaction
的必要功能。然后在您的 C# 代码中创建一个类型,通过将实现委托给 SqlTransaction
的实例来实现此接口。然后公开一个允许实例化包装器接口的方法。在 Delphi 端,消费者将实例化您的包装器接口并将其传递给 BulkInsert
。当然,您将更改 BulkInsert
以接受包装器接口作为其参数,而不是 SqlTransaction
.
当我使用类型库导入程序将特定于 .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 方法?
也许你应该先获取 Interop 代理对象,通常在 visual studio 项目中导入类型库是由 ide 自动完成的,我认为 Delphy 应该实现相同的功能, 但我不确定..
这完全可以预料。 SqlTransaction
类型是 .net 类型,您的 COM 接口未知。您怎么能期望其他方(在本例中为 Delphi 程序)能够获得 .net SqlTransaction
类型的实例。
您的 COM 接口需要限制自己只使用 COM 类型。您需要将 SqlTransaction
替换为 COM 接口。解决该问题的一种方法是声明一个 COM 接口,它公开 SqlTransaction
的必要功能。然后在您的 C# 代码中创建一个类型,通过将实现委托给 SqlTransaction
的实例来实现此接口。然后公开一个允许实例化包装器接口的方法。在 Delphi 端,消费者将实例化您的包装器接口并将其传递给 BulkInsert
。当然,您将更改 BulkInsert
以接受包装器接口作为其参数,而不是 SqlTransaction
.