我有一个本地的Delphi exe,它通过COM interop调用到C#dll中。下面是这证明这个问题最简单的例子:当从Delphi传递给C#作为函数参数时,空字符串变为空
德尔福:
IClass1 = interface(IDispatch)
['{B29BAF13-E9E4-33D7-9C92-FE28416C662D}']
function Test(const aStr: WideString): WideString; safecall;
end;
var
obj: IClass1;
s: string;
begin
obj := CoClass1.Create as IClass1;
s := obj.Test(''); // Returns '[null]'
end;
C#:
[ComVisible(true)]
public interface IClass1
{
string Test(string aStr);
}
[ComVisible(true)]
public class Class1 : IClass1
{
public string Test(string aStr)
{
if (aStr == null) return "[null]";
if (aStr == "") return "[empty]";
return "Not empty: " + aStr;
}
}
当我打电话的方法测试与德尔福一个空字符串,在C#部分接收null作为一个参数值。这是为什么?它不应该是一个空的字符串吗?
是的,但是您不必强制使用WideString,因为我在答案中指出了这一点。 –