Wix中的C#自定义操作

问题描述:

卸载应用程序时,需要通知服务器,以便它可以释放分配给客户端的许可证密钥。这是通过Web服务调用完成的。Wix中的C#自定义操作

我创建了一个C#自定义操作。问题是,卸载程序正在放弃说它无法找到一个dll。

错误日志为MSI包含以下错误:

Error 1723. There is a problem with this Windows Installer package. A DLL required for this install to complete could not be run. Contact your support personnel or package vendor. Action ReadLicenseKeyFromFile, entry: ReadLicenseKey, library: C:\Windows\Installer\MSI4F42.tmp

我有标记为自定义操作的功能ReadLicenseKey。自定义操作名为ReadLicenseKeyFromFile。

<Custom Action="ReadLicenseKeyFromFile" After="InstallInitialize"> 
    REMOVE~="ALL" AND NOT UPGRADINGPRODUCTCODE 
</Custom> 

<CustomAction Id="ReadLicenseKeyFromFile" BinaryKey="UnInstallCA.CA.dll" DllEntry="ReadLicenseKey" Execute="immediate" Return="check" /> 

<Binary Id="UnInstallCA.CA.dll" SourceFile="$(var.UnInstallCA.TargetDir)UnInstallCA.CA.dll" /> 

自定义操作项目正在输出.CA.dll文件。我已经尝试安装文件作为安装的一部分,手动复制粘贴文件,对文件没有做任何事情......基本上尝试了所有可能的组合。

必须有我丢失的东西,所以请帮助。

抱歉有浪费了每个人的时间。

该解决方案过于简单。我忘记了将[CustomAction]属性放在这个特定的方法上。所以即使它是我在CustomAction.cs文件中写入的最后一个动作,它也是第一个在InstallExecuteSequence中调用的动作。正因为如此,我误以为它无法找到该文件。那么,以及这一事实,我一定很困...

无论如何,虽然寻找答案,我确实设法遇到很多很好的资源,特别是Alex Shevchuks series on Wix。我意识到的另一件事是,我不必安装自定义动作DLL文件。我只是从我的Wix项目中引用它并提供它的路径。 dll会嵌入到设置中,并在调用卸载自定义操作时从那里进行流式传输。

UnInstallCA.CA.dll是否在安装过程中被复制到目标机器上?看来,它不在卸载。

如果它到达那里 - 它可以运行吗? (尝试从目标机器运行它,看看它是否可以做它应该做的事情 - 也许你需要从其中发布一些其他dll - 或者可能是一些可再发行的软件包)

+0

是的,安装DLL在安装时被复制。 不,我不知道如何模拟dll的使用。如果你的意思是通过创建一个引用dll的新项目然后调用该函数,那么发生。 – 2009-07-31 20:35:31

+0

@Anton Tykhyy - 我被告知你在一个小时前发布了一个我的问题的答案,但我看不到那个答案。从我的档案中,我只能看到答案的一部分。 自定义操作项目正在从DTF运行必需的实用工具,该工具将托管的dll转换为非托管的.CA.dll。和这个.CA.dll是我正在安装与我的设置一起。有无论如何,我可以检查什么路径是设置看着找到DLL? – 2009-07-31 20:41:27