Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi:如何调用.Net 4.0版的strongNameSignatureReferenceEx_.net_Delphi_Interop_Jedi_Jedi Code Library - Fatal编程技术网

Delphi:如何调用.Net 4.0版的strongNameSignatureReferenceEx

Delphi:如何调用.Net 4.0版的strongNameSignatureReferenceEx,.net,delphi,interop,jedi,jedi-code-library,.net,Delphi,Interop,Jedi,Jedi Code Library,我正在尝试从Delphi(使用Rad Studio Berlin)调用IClrStrongName上的strongNameSignatureReferenceEx 我的第一次尝试只是使用了定义 function StrongNameSignatureVerificationEx( wszFilePath : LPCWSTR; fForceVerification : boolean; var pfWasVerifided : boolean ): BOOL; stdcall; ext

我正在尝试从Delphi(使用Rad Studio Berlin)调用
IClrStrongName
上的
strongNameSignatureReferenceEx

我的第一次尝试只是使用了定义

function StrongNameSignatureVerificationEx(
  wszFilePath : LPCWSTR;
  fForceVerification : boolean;
  var pfWasVerifided : boolean
): BOOL; stdcall; external 'mscoree.dll';
但是这调用了.Net 2.0版本(目标计算机不需要该版本,它给出了一个很好的“请安装.Net framework 2.0/3.5消息”)

有一种机制可以创建CLR主机,并使用
TJclClrHost

var
  anHost : TJclClrHost;
  aClsId : TGUID;
  res : Boolean;
  obj : OleVariant;  // ? Not sure about this, copying from another example
begin

    anHost := TJclClrHost.Create('v4.0.30319');
    anHost. Start
    aClsId := StringToGuid('{9280188d-0e8e-4867-b30c-7fa83884e8de}'); 
    res := anHost.GetInterface(aClsId, obj);

    //...
但是,我没有
iclrsstrongname
的Delphi定义,所以一旦我得到了对象,我就不知道如何调用它上的任何方法。导入McSea.TLB不给出一个,而WebSturk只从

中向我显示C++定义。
  • 上面的代码正确吗(尤其是GetInterface()的“obj”参数)
  • 我是否需要一个接口定义来调用该方法(有没有按名称调用的方法)
  • 在哪里可以获得IClrStrongName的Delphi定义
  • 如何将C++定义转换成Delphi?< /LI>
    最简单的方法是创建一个导出所需功能的.net类库。一些方法可以做到这一点:

  • 使用混合模式C++/CLI类库。它允许您直接创建类非托管导出。这些反过来又可以调用托管代码
  • 创建一个C#类库,并使用Robert Giesecke的UnmanagedExports库公开您的功能
  • 在这两种情况下,最终都会得到一个.dll文件,您可以使用
    external
    指令将其函数导入Delphi


    <> P>有大量的例子说明如何在Web上同时完成这两个问题,这里有堆栈溢出,所以我不会尝试创建更多相同的例子。< /P>“4.我如何将C++定义转换成Delphi?”——最好的是,用手。读取C++定义并转换为相应的Delphi类型和构造。拉扎勒斯也有h2pas util,绝地Win API库中也有一些东西。但是它们可能被破坏或过时,调试它们的输出,你必须能够理解C++和Delphi构造的底层的表示,这使得你能够手动地转换它们,回到原来的一个。@ Arioch,我害怕…但这听起来很像工作:)这是我清单上的下一个问题,但我想我会先发布一个问题,只是有可能有一个更快的方法,或者其他人已经做过:?那就是学习一次低级(汇编级)表示,然后它就没有那么多了,然后翻译将是微不足道的,如果单调乏味的话(但是一个单一的方法翻译太少了,不能称之为乏味的工作)。或者你可以记住模式,但如果你的记忆失败,你将无法在Delphi调试CPU窗口中发现问题。COM的一个例子(但不是.Net)接口转换——在绝地Windows API库中应该有更多的例子,我们将对此进行检查,感谢在我的JCL版本中,JclDotNEt单元中没有GetInterface方法。这意味着这一切都是过去3年的最新开发。这意味着您使用的是一个前沿代码,除了开发人员之外,很少有人有任何经验。这意味着,你最好在那里搜索JCL开发者论坛并征求意见。恐怕我们已经有了C#程序集,我们正在从Delphi访问该程序集。问题是该程序集将被一个假的程序集所取代(说来话长,这里没有关系),因此我正在使用上述调用(以及其他调用)从Delphi到检查C#汇编的命名和签名。创建一个新的汇编来检查第一个汇编的安全性只会将问题向后推一步。我恐怕不太确定第一点的意思,但我感觉这涉及到在混合中添加另一种语言,这可能比我希望的要多做。怎样才能阻止伪造者,伪造
    IClrStrongName
    ?或者替换你的可执行文件?你肯定可以信任一些东西吗?@Arioch'这对我来说毫无意义。如果没有代码可以信任,那么整个练习就毫无意义。如果一些代码可以信任,就把类库放在受信任的区域。没关系。我们似乎在讨论构造问题中不存在的INT。我认为“希望”在讨论安全性时,我真的不想看到这个词。我觉得很可疑!强名称不是一种安全功能。它们是避免DLL地狱的一种手段。你可能给自己一种错误的安全感。尽管从你的评论字里行间读到,你已经知道这一点,而且是被上级强迫这样做的我不会听你的!