2

我正在尝试从 Delphi 致电StrongNameSignatureVerificationExIClrStrongName使用 Rad Studio Berlin)

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

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

    //...

但是,我没有 Delphi 定义,IClrStrongName所以一旦我得到对象,我就看不到如何调用它的任何方法。导入 mscoree.tlb 并没有给出一个,并且网络搜索只向我显示了来自的 C++ 定义

  1. 上面的代码是否正确(尤其是 GetInterface() 的 'obj' 参数)?
  2. 我是否需要一个接口定义来调用该方法(有没有办法通过名称调用)?
  3. 我在哪里可以获得 IClrStrongName 的 Delphi 定义?
  4. 如何将 C++ 定义转换为 Delphi?
4

1 回答 1

1

最简单的方法是创建一个导出所需功能的 .net 类库。一些方法可以做到这一点:

  1. 使用混合模式 C++/CLI 类库。这允许您直接创建类非托管导出。这些反过来可以调用托管代码。
  2. 创建一个 C# 类库并使用 Robert Giesecke 的 UnmanagedExports 库来公开您的功能。

external在这两种情况下,您最终都会得到一个 .dll 文件,您可以使用该指令将其函数导入 Delphi 。

在网络上和 Stack Overflow 上有很多关于如何做这两个事情的示例,所以我不会尝试创建更多相同的示例。

于 2017-05-30T12:41:41.073 回答