我有几个从 native .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]
吗?
最佳答案
OutAttribute
确定参数的运行时 行为,但它对编译时 没有影响。如果要使用编译时语义,则需要 out
关键字。
仅使用 out
关键字将更改运行时编码(marshal)处理,因此 OutAttribute
是可选的。参见 this answer了解更多信息。
关于C# - 为什么我需要初始化一个 [Out] 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26653250/