gpt4 book ai didi

.net - 如何从 Delphi 调用 .NET?

转载 作者:行者123 更新时间:2023-12-03 14:40:34 26 4
gpt4 key购买 nike

这不是重复的

上面的重复标记注释 ^ 是错误的。

如何从 Delphi 2010 程序调用 .NET 库(而不是注册的 COM 对象)的参数化方法?

具体来说,我想访问 Saxon API,如文档 here 所示。 。具体来说,我可以创建一个 XsltCompiler 并读取 BaseURI 属性,但不设置它。

我使用 Win32 COM 服务器对象(mscoree.dll 和 mscorlib.dll)和后期绑定(bind)取得了一些成功。这要归功于 Project-Jedi TJclClrHost 组件的示例。我可以加载 .NET 程序集、创建 .NET 对象以及读取简单的字符串属性或不带参数的函数。我的问题是如何传递参数?

这个问题的例子是如何设置从 Saxon .NET 程序集加载的 XsltCompiler 的基本 URI。 BaseUri 的 API 已记录为 here ,其中最突出的部分是...

public Uri BaseUri {get; set; }

使用反射,我确定 setter 函数的名称是“set_BaseUri”。

可以使用从 mscorlib.dll 导入的类型库中的后期绑定(bind)/反射来调用此方法。相关方法如下。

_Type = interface(IDispatch)
['{BCA8B44D-AAD6-3A86-8AB7-03349F4F2DA2}']
....
function InvokeMember(const name: WideString; invokeAttr: BindingFlags; const Binder: _Binder;
Target: OleVariant; args: PSafeArray; modifiers: PSafeArray;
const culture: _CultureInfo; namedParameters: PSafeArray): OleVariant; safecall;
...
end;

到目前为止我尝试过什么?

在我的 Delphi 2010 程序中,我写..

FType.InvokeMember( 'set_BaseUri',
BindingFlags_Public or BindingFlags_Instance or BindingFlags_InvokeMethod or
BindingFlags_SetField or BindingFlags_SetProperty,
nil, FInstance, args, modifiers, nil, nil);

其中: FType 的类型为 _Typeargsmodifiers 都是长度为 1 的 PSafeArray。modifiers 应该是一个 bool 数组,用于表示参数是按引用传递还是按值传递。在我们的例子中,这是一个由值为 False 的 bool 值组成的数组(按值传递)。 args 应该是实际参数值的数组。

我尝试了各种数组元素类型,但我不断收到错误“指定的数组不是预期的类型。”

这是我将参数 safeArray 设置为某个字符串的代码。

var
args: PSafeArray;
argsbound: TSafeArrayBound;
PassByRef: boolean;
Idx: integer;
OValue: OleVariant;
begin
Idx := 0;
argsbound.cElements := 1;
argsbound.lLbound := 0;
args := SafeArrayCreate( VT_VARIANT, 1, argsbound);
OValue := 'www.abc.net.au';
SafeArrayPutElement( args, Idx, OValue);
...

我研究过的途径,但不是解决方案

这不是重复的

ChrisF 错误地将其标记为 duplicate 。引用的问题和答案仅涉及开发人员控制和编写 .Net 程序集的情况。如前所述,尝试调用的程序集是第三方(Saxon)。该问题已得到令人满意的回答,但不应作为重复问题而关闭。

最佳答案

不太熟悉 Saxon API,但我熟悉 Delphi、.NET 和 COM 互操作性。

我建议你创建一个 facade pattern使用您最喜欢的(或最容易接受的).NET 语言围绕 Saxon API。在这些包装类上保留 ComVisible True。然后通过COM Interop访问这个包装程序集在德尔福。

你真的可以侥幸逃脱 adapter patter ,但由于我假设您不需要访问整个 Saxon API,那么外观更合适。

关于.net - 如何从 Delphi 调用 .NET?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16785357/

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