DLLs (динамически подключаемые библиотеки) и SLs (совместно использованные библиотеки, эквивалентные под UNIX), являются просто библиотеками исполняемого кода, который может быть динамично связан в исполняемый файл во время загрузки.
библиотеки Static введены в исполняемый файл во время компиляции и фиксируются от той точки. Они увеличивают размер исполняемого файла и не могут быть совместно использованы.
библиотеки Dynamic имеют следующие преимущества:
1/Они загружаются во время выполнения, а не время компиляции, таким образом, они могут быть обновлены независимо от исполняемого файла (все те необычные окна и диалоговые окна, которые Вы видите в Windows, прибывшем от DLLs, таким образом, стиль Вашего приложения может измениться без Вас имеющий необходимость переписать его).
2/, поскольку они независимы, код, может быть совместно использован через несколько исполняемых файлов - это сохраняет память с тех пор при выполнении 100 приложений с единственным DLL может только быть одна копия DLL в памяти.
Их основной недостаток является преимуществом № 1 - имеющий изменение DLLs, независимое, Ваше приложение может заставить Ваше приложение прекращать работать или начинать вести себя причудливым способом. Управление версиями DLL имеет тенденцию не быть организованным очень хорошо в соответствии с Windows, и это приводит к странно названному "Ад DLL".
Пробовали ли вы запрашивать свойство INSTALLLOCATION непосредственно из управляемого центра сертификации?
string cad = session["INSTALLLOCATION"];
Одно из преимуществ использования DTF заключается в том, что у вас есть доступ для чтения / записи ко всем свойствам MSI без использования командных строк и т. Д. даже если INSTALLLOCATION не может быть запрошен как обычное свойство, вы можете определить собственное свойство MSI, установив для него значение INSTALLOCATION, и вместо этого запросить его внутри вашего CA.
Ваша передача значения корректна, но попробуйте ссылаться на него.
string[] keys = new string[session.CustomActionData.Keys.Count];
session.CustomActionData.Keys.CopyTo(keys, 0);
string cad = keys[0];
Это должно установить cad
в путь установки так, как вы хотите.
Если вы разметите свои данные как ...
<CustomAction Id="MyCustomActionData" Return="check" Property="MyCustomAction" Value='PROPERTY0=[PROPERTY0];PROPERTY1=[PROPERTY1];PROPERTY2=[PROPERTY2]' Execute='immediate' />
Вы можете получить доступ к таким данным, как:
string property0 = session.CustomActionData["Property0"];
string property1 = session.CustomActionData["Property1"];
string property2 = session.CustomActionData["Property2"];
В предыдущем примере вы использовали бы:
<CustomAction Id="RegisterDflHelp.SetProperty" Return="check" Property="RegisterDflHelp" Value='INSTALLLOCATION=[INSTALLLOCATION]' Execute='immediate' />
затем
string cad = session.CustomActionData["INSTALLLOCATION"];
Я сделал это, используя следующее в . WXS file:
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder" Name="PFiles">
<Directory Id="ManufacturerDir" Name="Company" ShortName="Company">
<Directory Id="INSTALLDIR" Name="TheApp">
<Directory Id="BatchFileLocation" Name="BatchFiles">
<Component Id="BatchFilesComp" ... >
<File Id="SomeFile_BAT" Source="BatchFiles\SomeFile.bat" Name="SomeFile.bat" ... />
</Component>
</Directory>
</Directory>
</Directory>
</Directory>
</Directory>
И в пользовательском Action:
var batchDirectory = session.GetTargetPath("BatchFileLocation");
var batchFile = batchDirectory + "SomeFile.bat"
Теперь я еще не выяснил, как избежать дублирования имени файла, но это успешно возвращается туда, где был установлен пакетный файл.