Симон Моурир дал этот пример :
object o = null;
DateTime d = (DateTime)o; // NullReferenceException
, где unboxing преобразование (литье) из object
(или из одного из классов System.ValueType
или System.Enum
или из типа интерфейса) - тип значения (кроме Nullable<>
) сам по себе дает NullReferenceException
.
В другом направлении конверсия бокса из a Nullable<>
, которая имеет HasValue
, равную false
, на ссылочный тип, может дать ссылку null
, которая затем может привести к NullReferenceException
. Классический пример:
DateTime? d = null;
var s = d.ToString(); // OK, no exception (no boxing), returns ""
var t = d.GetType(); // Bang! d is boxed, NullReferenceException
Иногда бокс происходит по-другому. Например, с помощью этого не общего метода расширения:
public static void MyExtension(this object x)
{
x.ToString();
}
следующий код будет проблематичным:
DateTime? d = null;
d.MyExtension(); // Leads to boxing, NullReferenceException occurs inside the body of the called method, not here.
Эти случаи возникают из-за специальных правил, используемых во время выполнения при боксе Nullable<>
экземпляров.
MSI, созданный проектом установки (в Visual Studio), может ориентироваться только на одну платформу за раз. Ваш вариант состоит в том, чтобы либо сделать 2 MSI, объединить их вместе и создать настраиваемый установочный загрузочный ленту, который выбирает между ними. Есть некоторые сторонние продукты, например Advanced Installer , например, которые могут сделать это для вас.
Я тоже столкнулся с этим, и написал сообщение в блоге о моем решении:
Файл deflate.exe
можно загрузить из своего репозитория ] в коде google.
.Net имеет опцию «Любой процессор». Заманчиво думать об этом как о «универсальном» варианте, который будет использовать только меньшие функции x86, но на самом деле он позволяет компилятору JIT на каждой машине выбирать соответствующий тип процессора для этой машины.
Единственный раз, когда вы не должны его использовать, - это знать, что у вас есть зависимости или требования, которые не подходят для одной архитектуры или другой. Например: вы знаете, что вам нужна партия для ram, у вас есть зависимость от 32-разрядной родной DLL или вы хотите предварительно скомпилировать приложение.
Здесь существует опасность, потому что у вас есть зависимость DLL от конкретной платформы. Но у вас есть dll для обоих типов, и кажется, что вы знаете, как выбрать правильный вариант во время выполнения. Так будет ли работать опция «Любой процессор»?