2014-10-30 3 views
4

У меня есть несколько методов, импортируемых из нативного .dll, используя следующий синтаксис:C# - Почему мне нужно инициализировать параметр [Out]

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

OutAttribute определяет выполнения поведения параметра, но это не имеет никакого влияния на время компиляции . Ключевое слово out требуется, если вы хотите использовать семантику времени компиляции.

Использование только ключевого слова out изменит маршалинг времени выполнения, поэтому OutAttribute не является обязательным. См. this answer для получения дополнительной информации.

+0

Итак, если я не хочу использовать семантику времени компиляции, действительно ли будет работать код с инициализацией? (То есть, я получу правильное значение в 'param'?) И, предположим, я это сделаю, будет ли это работать, если я буду держать' out' и '[Out]'? – rmobis

+0

Я считаю, что ответ да для обоих, если внешняя функция написана правильно, чтобы ожидать параметр 'out'. – user1620220

0

Вы инициализируете его значением внутри функция? Вот в чем заключается требование: out параметры должны быть назначены хотя бы один раз в функции, объявляющей параметр.

+1

Поскольку это внешняя dll, я сомневаюсь, что компилятор знает, что внутри функции. – user1620220

+0

Даже если бы я не был, разве это не должно было дать мне ошибку в определении функции, а не в вызове? – rmobis

+1

Как это ответить на вопрос? Мне кажется, что это должно быть опубликовано как комментарий, так как он запрашивает только разъяснения. – Default