问题 Wix中的C#自定义操作


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

我创建了一个C#自定义操作来执行此操作。问题是,卸载程序正在退出,说它无法找到一个DLL。

msi的错误日志包含以下错误:

错误1723.存在问题   这个Windows Installer包。一个DLL   完成此安装所需   无法运行。联系您的支持   人员或包装供应商。行动   ReadLicenseKeyFromFile,条目:   ReadLicenseKey,库:   C:\ WINDOWS \安装\ 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文件。我已经尝试安装文件作为设置的一部分,手动复制粘贴文件,没有对文件做任何事情......基本上尝试了所有可能的组合。

必须有一些我缺少的东西,所以请帮忙。


7553
2017-07-31 17:53


起源



答案:


很遗憾浪费了每个人的时间。

解决方案太简单了。我忘了在这个特定的方法上放置[CustomAction]属性。因此,尽管这是我在CustomAction.cs文件中编写的最后一个操作,但它是第一个在InstallExecuteSequence中调用的操作。因此,我误以为它无法找到该文件。好吧,那个以及我一定很困的事实......

无论如何,在寻找答案时,我确实设法遇到了很多不错的资源,尤其是 Wix上的Alex Shevchuks系列。我意识到的另一件事是我不必安装自定义动作DLL文件。我只是从我的Wix项目中引用它并提供它的路径。 dll嵌入到设置中,并在调用卸载自定义操作时从那里进行流式处理。


11
2017-08-02 23:16



当我给自己造成同样的问题时,我使用的依赖于查看DLL并检查正确的符号是否真正导出。 / L - leiflundgren
感谢您发布您的答案,我只是犯了同样的(简单)错误而没有意识到,这样一个神秘的错误信息! - si618


答案:


很遗憾浪费了每个人的时间。

解决方案太简单了。我忘了在这个特定的方法上放置[CustomAction]属性。因此,尽管这是我在CustomAction.cs文件中编写的最后一个操作,但它是第一个在InstallExecuteSequence中调用的操作。因此,我误以为它无法找到该文件。好吧,那个以及我一定很困的事实......

无论如何,在寻找答案时,我确实设法遇到了很多不错的资源,尤其是 Wix上的Alex Shevchuks系列。我意识到的另一件事是我不必安装自定义动作DLL文件。我只是从我的Wix项目中引用它并提供它的路径。 dll嵌入到设置中,并在调用卸载自定义操作时从那里进行流式处理。


11
2017-08-02 23:16



当我给自己造成同样的问题时,我使用的依赖于查看DLL并检查正确的符号是否真正导出。 / L - leiflundgren
感谢您发布您的答案,我只是犯了同样的(简单)错误而没有意识到,这样一个神秘的错误信息! - si618


您的UnInstallCA.CA.dll是否在安装期间复制到目标计算机?似乎卸载时不存在。

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


0
2017-07-31 18:19



是的,安装dll是在安装时复制的。不,我不知道如何模拟使用DLL。如果你的意思是创建一个引用dll的新项目,然后调用该函数,是的。 - Amith George
@Anton Tykhyy - 我被告知你在一小时前发布了我的问题的答案,但我看不出那个答案。从我的个人资料中,我只能看到答案的一部分。自定义操作项目正在从DTF运行所需的实用程序,该实用程序将托管的dll转换为非托管的.CA.dll。这个.CA.dll就是我和我的设置一起安装的。无论如何,我可以检查设置查找dll的设置路径是什么? - Amith George
一个问题可能是变量路径。我从来没有像那样使用它:) - 硬编码真实的路径,看看是否有效。 - da_m_n