【发布时间】:2021-12-01 18:10:19
【问题描述】:
我正在尝试将加密函数从我们的旧代码中分离到一个我可以从 C# 调用的 dll 中,但是我在让它工作时遇到问题,并且在调用 dll 时我不断遇到访问冲突。
我不确定 AV 发生在哪里,因为当 dll 附加到另一个进程时,delphi 很难达到我的断点。
我昨天在这里使用 David Heffernan 的回答让它工作:Returning a string from delphi dll to C# caller in 64 bit
但是我的成功是短暂的,因为我将字符串参数更改为常规的string's (delphi),发现它不起作用并将它们更改回AnsiString(我们的加密例程需要 Ansi)。因为我改变了这些参数类型。我无法让它再次工作。
这是我的 Delphi 代码:
procedure Encrypt(const Source: AnsiString; const Key: AnsiString; var OutPut:PAnsiChar; const OutputLength: Integer);
var
EncryptedString, EncodedString: AnsiString;
begin
EncryptedString := Crypt(Source, Key);
EncodedString := Encode(EncryptedString);
if Length(EncodedString) <= OutputLength then
System.AnsiStrings.StrPCopy(Output, EncodedString);
end;
exports
Encrypt;
我的 C# 调用者:
[DllImport("AsmEncrypt.dll", CharSet = CharSet.Ansi)]
public static extern void Encrypt(string password, string key, StringBuilder output, int outputlength);
// using like this:
Encrypt(credentials.Password, myKey, str, str.Capacity);
我现在最好的选择是,我已经对 dll 进行了一些参数设置,因为它似乎在到达 OutputDebugStr() 之前就崩溃了,我在 Encrypt() 的第一行放置了
我们将不胜感激所有帮助
【问题讨论】:
-
确定第三个参数完全错误 -
StringBuilder -
参考 David Heffernans 在链接帖子中的回答它应该可以工作,我昨天让它工作了吗?你如何建议我传递一个缓冲区供 delphi 写入?
-
我的意思是 - StringBuilder 是 .NET 类,你不能像在 C# 和本机 Delphi 代码之间那样传递它。
-
在C#端,你仍然需要为调用定义marshaler。
[DllImport("AsmEncrypt.dll", CharSet = CharSet.Ansi)] public static extern void Encrypt([MarshalAs(UnmanagedType.LPTStr)] string password, [MarshalAs(UnmanagedType.LPTStr)] string key, [MarshalAs(UnmanagedType.LPTStr)] string output, [MarshalAs(UnmanagedType.I4)]int outputlength);
标签: c# string delphi dll interop