2016-06-10 57 views
1

我一直在寻找一种解决方案,以编程方式覆盖我的应用程序功能的目录路径。如何创建wix类型35自定义动作

我发现我需要一个类型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; 

回答

3

35类型的自定义操作调用MsiSetTargetPath更改目录的位置。如果您已经有了基于DTF的自定义操作,则可以拨打session.SetTargetPath而不是设置属性。

如果您还没有基于代码的自定义操作,则可以使用参数略少的CustomAction element来生成类型35操作。即省略BinaryKey和DllEntry:

<CustomAction Id=... Return=... Execute=... 
    Directory="SYNERGY_FEATURE_FOLDER" Value="location"/> 
+0

谢谢。我没有意识到35型自定义操作只是一个实现,我不需要自己创建它。 –

0

你的意思,只是在该功能的文件是去一个不同的位置在系统中的其它文件?你正在做的事情看起来会导致INSTALLFOLDER/TARGETDIR位置被设置,这意味着所有发往INSTALLFOLDER的文件都将到达该位置。当你说你想让某个功能中的文件走到某个不同的地方时,这似乎不是你所要求的。

如果有一些文件要发送到您设置的某个文件夹,并且您希望剩下的文件到预定义的位置(ProgramFiles,GAC,Common Files等),那么您基本上只是定义一个目录属性,并且在该目录下指定您的组件。您的自定义操作将设置该属性名称,因此目录位置具有所需的值,其余文件将转到应该去的位置。