2012-01-06 2 views
2

Когда, если когда-либо, безопасно ли обертывать за условным кодом, который требует сборки, которая может отсутствовать?Когда безопасно обертывать условный код, требующий сборки, которая может отсутствовать?

Например:

if (SafeCheckForOptionalAssembly()) { 
    // Code requiring an optional assembly 
} else { 
    // fallback: don't rely on optional assembly 
} 

Непосредственно вопросы, связанные:

  1. Имеет ли значение, если условно включен код использует тип, содержащийся в дополнительном сборе? (например, var foo = new MyClassInOptionalAssembly())
  2. Изменяется ли поведение, если условно включенный код завернут в метод?
+0

Я поместил код, требующий дополнительной сборки в метод. Таким образом, он работал в .NET 3.5 и 4. Но я не уверен, что это гарантировано не подведет. Код не удался, если указанный код был включен напрямую. – Vlad

+0

, который не будет работать - по крайней мере, не во всех случаях/на всех платформах ... почему бы не использовать «интерфейс», включить реализацию по умолчанию, а затем проверить, присутствует ли дополнительная сборка (реализация этого интерфейса) и, если это так, от Ассамблеи в противном случае использовать реализацию по умолчанию? – Yahia

ответ

3
  1. Да, не работает. Джиттер будет бомбить, пытаясь до скомпилировать метод до его запуска. Исключение возникает в вызывающем методе.

  2. Возможно. Но чтобы быть на 100% уверенным, вам нужно применить атрибут [MethodImpl (MethodImplOptions.NoInlining)], чтобы метод никогда не становился вложенным.

Эти предположения действительны только для джиттера, который компилируется по требованию. Ошибки Microsoft x86 и x64. Моно джиттер не (последний раз я смотрел).

+1

+1, но: это поведение _guaranteed_ по некоторым спецификациям? – Vlad

+1

Нет гарантий, это все очень специфично, как указано в последнем предложении. –

Смежные вопросы