Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Я изменил бы Feature1, Feature2 и Feature3 к Компонентам, затем объявлю что-то вроде этого:
<Feature Id="FEATUREA" Title="Super" Level="1" >
<ComponentRef Id="Component1" />
<ComponentRef Id="Component2" />
</Feature>
<Feature Id="FEATUREB" Title="Super1" Level="1" >
<ComponentRef Id="Component1" />
<ComponentRef Id="Component3"/>
</Feature>
Затем для Установки или FeatureA или FeatureB
msiexec /i install.msi ADDLOCAL=[FEATUREA | FEATUREB]
Принятый ответ уже упоминает свойство ADDLOCAL, но, кажется, подразумевает, что можно выбрать только одну функцию. Можно на самом деле выбрать несколько функций путем разделения их запятыми как это:
msiexec /i install.msi ADDLOCAL=Feature1,Feature2
или
msiexec /i install.msi ADDLOCAL=Feature2,Feature3
Другая подсказка: можно обнаружить эти имена функции путем открытия msi с косатка . Это очень полезно, когда Вы хотите использовать эти приемы для создания bootstrapper, который устанавливает определенные функции сторонних msi пакетов.
Существует много свойств, которые могут управлять состояниями установки Функций. Проверьте эту документацию SDK MSI и ссылки от нее: http://msdn.microsoft.com/en-us/library/aa367536 (По сравнению с 85) .aspx