【发布时间】:2014-03-17 13:46:59
【问题描述】:
修改后的问题:
我们使用 D7 调用 COM 对象中的 C# 方法。 C# 方法返回一个 WideString。
当我们在 Pascal 代码中使用返回的 WideString 时,.NET 是否存在垃圾收集我们脚下返回的 WideString 的风险?如果是这样,我们有什么替代方法可以安全地从 C# COM 对象返回字符串?
另外,我们最后的 Delphi 行 SubMan := nil 是释放 COM 对象的正确方法吗?
C# 代码
[DispId(5)]
bool Test(int var1, ref int var2, ref string var3);
public bool Test(int var1, ref int var2, ref string var3)
{
bool result;
if (var1 == 0)
{
var2 = 0;
var3 = "zero";
result = true;
}
else
{
var2 = -1;
var3 = "minus one";
result = false;
}
return result;
}
来自 D7 中生成的 TLB 的帕斯卡代码
function Test( var1: Integer;
var var2: Integer;
var var3: WideString): WordBool; dispid 5;
调用 COM 对象的 Pascal 代码。 var3 是否有被 GC-ed 的风险?
procedure TForm1.Button1Click(Sender: TObject);
var
SubMan: TSubMan;
Var1: Integer;
Var2: Integer;
Var3: WideString;
FunctionResult: Boolean;
begin
SubMan := COTSubMan.Create;
Var1 := 1;
FunctionResult := SubMan.Test(Var1, Var2, Var3);
// Will Var3 above be persistent in the code
// or might it be garbage collected by .NET before we can use it below or later?
ShowMessage( BoolToStr(FunctionResult, TRUE) +
' Var2 = ' + IntToStr(Var2) +
' Var3 = ' + Var3);
SubMan := nil; // Is this the right way to release the COM object?
end;
【问题讨论】:
-
请将C#
Test方法中的代码和调用Test的Dephi客户端中的代码贴出来。EOleSysError是调用方法还是从方法返回? -
如果是 COM 则使用 COM 字符串。问题缺乏细节。
-
您添加的代码不完整。显示完整的 C# 类声明。
-
Var3 (WideString) 被引用计数。它会在离开作用域时被释放,即当你的方法
Button1Click()结束时。 -
@LURD 只是为了确认一下,即使字符串最初是在 C# COM 对象中分配的,在我们的 Delphi Button1Click 方法中使用 var3 是安全的吗?这真是个好消息。我可以问是怎么发生的吗?当 COM 调用从 C# 返回时,var3 字符串是由 Delphi 创建的 C# 字符串的 copy 吗?