gpt4 book ai didi

c# - .net 类型在类型库中被 IUnknown 替换

转载 作者:行者123 更新时间:2023-11-30 15:21:18 26 4
gpt4 key购买 nike

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

最佳答案

这完全可以预料。 SqlTransaction 类型是 .net 类型,您的 COM 接口(interface)未知。您怎么能期望其他方(在本例中为 Delphi 程序)能够获得 .net SqlTransaction 类型的实例。

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

关于c# - .net 类型在类型库中被 IUnknown 替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37830152/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com