WiX - 复制任意文件

时间:2015-06-09 15:08:06

标签: c# wix

我的setup.exe所在的文件夹包含一个子文件夹CAL,其文件名称类似于xyz1234.cal - 它们的名称因客户而异。必须将这些文件复制到目标目录中的文件夹CAL中。 所以我创建了一个CustomAction和一个使用File.Copy()函数的C#dll。我的C#函数接收字符串srcDirdestDir作为参数,例如D:\installation\CALC:\MyApp\CAL。 但是,当我使用Directory.Exists(srcDir)检查文件夹是否存在时,会抛出异常,尽管目录D:\installation\CAL存在:

ERROR in custom action myFunction System.IO.DirectoryNotFoundException: Could not find a part of the path 'C:\Windows\Installer\MSID839.tmp-\D:\installation\CAL'.

无论CustomAcion是立即执行还是延迟执行,都会发生这种情况。 C:\Windows\Installer\MSID839.tmp-\似乎是已执行程序集的路径,但我当然不希望将其作为FullPath的一部分。我怎么能摆脱它?

CustomAction和属性定义如下: <CustomAction Id='myCA' BinaryKey='myCABin' DllEntry='myFunction' Execute="deferred" HideTarget="no" Impersonate="no"/> <Property Id="myCA" Value="Arg1=[CURRENTDIRECTORY];Arg2=[INSTALLDIR]" />

参数的使用如下:

CustomActionData data = session.CustomActionData;
string srcDir = data["Arg1"]+ "\\CAL";
string destDir = data["Arg2"]+ "\\CAL";
if (Directory.Exists(srcDir))
    // copy files

2 个答案:

答案 0 :(得分:0)

我重新创建了你的应用,它运行正常。这是我的wix代码(它在我的产品节点中):

<CustomAction Id='Test' BinaryKey='RegistryHelperCA' DllEntry='Test' Execute="deferred" HideTarget="no" Impersonate="no"/>
<Property Id="Test" Value="Arg1=[CURRENTDIRECTORY];Arg2=[INSTALLDIR]" />

<InstallExecuteSequence>
  <Custom Action="Test" After="InstallFiles"></Custom>
</InstallExecuteSequence>

我的自定义操作:

    [CustomAction("Test")]
    public static ActionResult Test(Session session)
    {
        string dir = session.CustomActionData["Arg1"];
        session.Log("DIRECTORY equals " + dir);

        if (Directory.Exists(dir))
            session.Log("Success");

        return ActionResult.Success;
    }

它将dir吐出C:\Users\user\Desktop。确认您没有在任何地方分配到CURRENTDIRECTORY媒体资源,如果找不到任何内容,请尝试将自定义操作设置为Execute="immediate"并访问此类数据

string srcDir = session["CURRENTDIRECTORY"]+ "\\CAL";

如果这不起作用,肯定会在某处覆盖该属性。祝你好运!

答案 1 :(得分:0)

在一些试错会后,我发现$userdata = array( 'user_login' => $_POST["post_email"], 'first_name' => $_POST["post_voornaam"], 'last_name' => $_POST["post_achternaam"], 'user_email' => $_POST["post_email"], 'user_pass' => $_POST["password_confirm"] ); $user_id = wp_insert_user( $userdata ) ; add_user_meta( $user_id, 'klant_id', $klant_id ); Directory.Exists(srcDir)没有用,因为不是值而是属性名称作为参数传递给{{ 1}}函数 - 与正确生成值的Directory.Exists(destDir)形成对比。

最后,我最终设置Exist()并检索如下值:

session.Log(srcDir)