我使用以下语法从本机.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]
吗?
答案 0 :(得分:2)
OutAttribute
确定参数的运行时行为,但在编译时时没有影响。如果要使用编译时语义,则需要out
关键字。
仅使用out
关键字将更改运行时编组,因此OutAttribute
是可选的。有关详细信息,请参阅this answer。
答案 1 :(得分:0)
您是否正在将其初始化为内部函数?这就是需求的来源:out
参数必须在声明参数的函数中至少分配一次。