我可以将用Delphi编写的DLL加载到PowerShell中吗?

时间:2017-11-10 13:49:52

标签: powershell delphi dll

我可以通过[Reflection.Assembly]::LoadFile()方法直接在Powershell中使用我在Delphi(Delphi 10)中创建的DLL吗?我正在尝试,但收到错误:

  

使用“1”参数调用“LoadFile”的异常:“模块是   预计会包含一个程序集清单。

我能够将Delphi DLL包装在我用C#编写的DLL中,并以这种方式使用它,但不愿意,因为它意味着为每次更改编译两个项目而不是一个。

这是我目前在Delphi DLL中的代码:

library TestDLL;


procedure TestCall(foo: PChar); stdcall;
begin
end;

exports
  TestCall;

begin
end.

1 个答案:

答案 0 :(得分:6)

您的Powershell代码适用于托管程序集。但是您的Delphi库是一个非托管DLL。要直接访问它,请使用pinvoke。这样一个简单的例子:

Delphi库

library TestDLL;

uses
  SysUtils;

function TestCall(foo: PChar): Integer; stdcall;
begin
  Result := StrLen(foo);
end;

exports
  TestCall;

begin
end.

要在库上方使用的Powershell脚本

$signature = @'
[DllImport(@"C:\Desktop\TestDLL.DLL", CharSet=CharSet.Unicode)]
public static extern int TestCall(string foo);
'@;

$type = Add-Type -MemberDefinition $signature -Name Win32Utils -Namespace TestDLL -PassThru;

[int] $retval = $type::TestCall("test string");
Write-Host($retval);

现在,我真的不是Powershell专家,所以这可能是草率的。希望它证明了这一点。对于更复杂的参数类型,您需要更高级的Powershell代码,但网上有很多示例。