C# - 为什么我需要初始化[Out]参数

时间:2014-10-30 12:40:09

标签: c# pinvoke marshalling out

我使用以下语法从本机.dll导入了几个方法:

internal static class DllClass {
    [DllImport("Example.dll", EntryPoint = "ExampleFunction")]
    public static extern int ExampleFunction([Out] ExampleStruct param);
}

现在,因为我将param指定为[Out],所以我希望以下代码段中至少有一个有效:

ExampleStruct s;
DllCass.ExampleFunction(s);

ExampleStruct s;
DllCass.ExampleFunction([Out] s);

ExampleStruct s;
DllCass.ExampleFunction(out s);

然而,它们都不起作用。我发现让它发挥作用的唯一方法是初始化s。

ExampleStruct s = new ExampleStruct();
DllCass.ExampleFunction(s);

我已经设法通过将第一个代码段重写为以下代码来解决这个问题,但这感觉有点多余。

internal static class DllClass {
    [DllImport("Example.dll", EntryPoint = "ExampleFunction")]
    public static extern int ExampleFunction([Out] out ExampleClass param);
}

我已阅读What's the difference between [Out] and out in C#?,因为接受的答案表明[Out]out在上下文中是等效的,所以它让我想知道为什么它不起作用对我来说,如果我的解决方案"是合适的。

我应该同时使用吗?我应该只使用out吗?我应该只使用[Out]吗?

2 个答案:

答案 0 :(得分:2)

OutAttribute确定参数的运行时行为,但在编译时时没有影响。如果要使用编译时语义,则需要out关键字。

仅使用out关键字将更改运行时编组,因此OutAttribute是可选的。有关详细信息,请参阅this answer

答案 1 :(得分:0)

您是否正在将其初始化为内部函数?这就是需求的来源:out参数必须在声明参数的函数中至少分配一次。