我一直在寻找一种解决方案,以编程方式覆盖应用程序功能的目录路径。
我发现我需要一个35型自定义操作(https://msdn.microsoft.com/en-us/library/windows/desktop/aa368093(v=vs.85).aspx)
我在互联网上搜索了一段时间,但我无法找到如何在C#中创建这样的自定义操作。
我当前的自定义操作如下:
<CustomAction Id="CheckForSynergyInstallation"
Return="check"
Execute="immediate"
BinaryKey="Real.CustomActions"
DllEntry="GetVersionInformation" Directory="SYNERGY_FEATURE_FOLDER" />
它的C#代码是这样的:
var synergyFolder = new FileInfo(exactSynergyVersionConfigurationFile).Directory.FullName;
log.Info($"Synergy Folder set to {synergyFolder}");
session["SYNERGY_FEATURE_FOLDER"] = synergyFolder;
答案 0 :(得分:3)
35类自定义操作调用MsiSetTargetPath来更改目录的位置。如果您已经有基于DTF的自定义操作,则可以调用session.SetTargetPath
而不是设置属性。
如果您还没有基于代码的自定义操作,则可以使用参数略少的CustomAction element来生成类型35操作。即省略BinaryKey和DllEntry:
<CustomAction Id=... Return=... Execute=...
Directory="SYNERGY_FEATURE_FOLDER" Value="location"/>
答案 1 :(得分:0)
您是说只是该功能中的文件与设置中的其他文件位于不同的位置?您正在做的事情看起来会导致设置INSTALLFOLDER / TARGETDIR位置,这意味着发往INSTALLFOLDER的所有文件都将转到该位置。当你说你想要一个功能中的文件去某个不同的地方时,这似乎不是你所要求的。
如果您要将某些文件发送到您设置的某个文件夹,并且您希望其余文件转到其预定义位置(ProgramFiles,GAC,Common Files等),那么您基本上只需定义一个目录属性,并指定您在该目录下的组件。您的自定义操作将设置该属性名称,因此目录位置具有所需的值,其余文件将转到它们应该去的位置。