加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何从Delphi调用.NET?

发布时间:2020-12-15 04:27:00 所属栏目:大数据 来源:网络整理
导读:这不是重复的 ^上面的重复标记注释是错误的. 如何从Delphi 2010程序中调用.NET库(不是注册的COM对象)的参数化方法? 具体来说,我想访问Saxon API,如文档here.具体来说,我可以创建一个XsltCompiler并读取BaseURI属性,但不能设置它. 我使用Win32 COM Server Ob
这不是重复的

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

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

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

我使用Win32 COM Server Objects(mscoree.dll和mscorlib.dll)和Late Binding已经取得了一些成功.这是由于Project-Jedi TJclClrHost组件的示例.我可以加载.NET程序集,创建.NET对象并读取简单的字符串属性或函数,而无需参数.我的问题是如何传递参数?

这个问题的例证是如何设置从Saxon .NET程序集加载的XsltCompiler的Base URI. BaseUri的API记录为here,其中显着的部分是…

public Uri BaseUri {get; set; }

使用反射,我确定setter函数的名称是’set_BaseUri’.

可以从mscorlib.dll导入的类型库中使用Late Binding / Reflection来调用此方法.相关方法如下.

_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;

到目前为止我已经尝试过

在我的德尔福2010课程中,我写了..

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

哪里:
FType类型为_Type.
args和修饰符都是一个长度为1的PSafeArray.修饰符应该是一个布尔数组,表示参数是通过引用传递还是通过值.在我们的例子中,这是一个值为False(通过值)的布尔值的数组. args应该是实际参数值的数组.

我已经尝试过各种数组元素类型,但是我不断收到错误’指定的数组不是预期的类型’.

这是我的代码,将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);
...

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

> Hosting CLR in Delphi with/without JCL – example
> http://www.blong.com/Conferences/BorConUK2002/Interop2/COMNetInterop.htm

这不是重复的

ChrisF错误地将其标记为duplicate.引用的问题和答案仅指开发人员控制和写入.Net程序集的情况.如所述,尝试被调用的程序集是第三方(Saxon).这个问题已经令人满意地回答了,但不应该是重复的.

解决方法

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

我建议你做的是在你喜欢的(或最容忍的).NET语言的Saxon API周围创建一个facade pattern.在这些包装类上离开ComVisible True.然后在Delphi中通过COM Interop访问这个包装器组件.

你可以真的离开一个adapter patter,但是由于我假设你不需要访问整个Saxon API,那么一个立面更合适.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读