這個問題在這里已經有了答案: 如何將 Delphi Stream 傳遞給 ac/c DLL (2 個回答) 8 小時前關閉。
Streams 對我來說非常神秘,所以請耐心和友好:) 我正在嘗試在 Delphi 中創建一個 Stream,我可以將它作為引數傳遞給 C#。有人知道怎么做嗎?
請注意,我可以從我的 Delphi 專案中呼叫 C# 函式,如下所示。我已經按照本教程從我的 C# 專案創建一個 DLL 并在 Delphi 中實作該 DLL。
procedure TForm1.Button1Click(Sender: TObject);
var
Stream : TStream;
Baz : TBaz;
begin
Baz := TBaz.Create(Self);
// Create Stream & call Bar() with the created Stream as parameter
Baz.Bar(?param?);
end;
我的 C# 專案如下所示:
public class Baz
{
public void Bar(?param?)
{
// Get stream here
}
}
我非常感謝任何幫助,純粹的!
編輯:
- 流應該是檔案流
uj5u.com熱心網友回復:
Delphi 和 C# 都支持IStream用于互操作性目的的介面。你可以用 包裹任何流TStreamAdapter。如果您在 Delphi 端構建流,您需要確保包裝的流實體比IStream包裝器的壽命更長,或者您需要將流的所有權傳遞給配接器。
uses
Winapi.ActiveX,
System.Classes;
var
FileStream: TFileStream;
Stream: IStream;
begin
FileStream := TFileStream.Create(...);
try
Stream := TStreamAdapter.Create(FileStream);
// use stream
Baz.Bar(Stream);
finally
Stream := nil;
FileStream.Free;
end;
end;
或者
var
FileStream: TFileStream;
Stream: IStream;
begin
FileStream := TFileStream.Create(...);
Stream := TStreamAdapter.Create(FileStream, soOwned);
// use stream
Baz.Bar(Stream);
end;
檔案:
System.Classes.TStreamAdapter
IStream介面
COM 互操作 IStream 的包裝類是否已經存在?
當然,您始終可以將檔案名傳遞給 C# 并在 C# 端構造流。
uj5u.com熱心網友回復:
流對于每個編譯器都是特定于實作的,因此您不能將(本機)Delphi TStream 傳遞給 C# 并期望它在那里作業。同樣,C# Stream 與(本機)Delphi TStream 不兼容,因此您也不能反其道而行之。
在 C# 類和 Delphi 類之間進行某種形式的互操作性是可能的(使用很多骯臟的技巧),但坦率地說,這將是很多作業,但收益卻很少,特別是(無意侮辱) 對于您當前的經驗水平(因為您認為流“神秘”)。
如果它是您嘗試傳遞的檔案,請改為傳遞檔案名,并讓 C# 端分配一個 C# 流來訪問它。
編輯:您可以使用 IStream 介面來包裝(本機)Delphi TStream 實體并將此介面傳遞給 C#,然后它應該能夠從(托管)C# 代碼訪問(本機)Delphi TStream。見 Dalija Prasnikar 的回答。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/357942.html
