我正在尝试在msi安装时执行自定义操作。但我的自定义操作所需的dll取决于其他dll。在安装时,它给出的错误如“完成此安装所需的dll无法运行”。如何加载依赖的dll文件以使此自定义操作正常运行。
我使用的代码是
<CustomAction Id='CheckingPID' BinaryKey='CheckPID' DllEntry='ValidateKey' />
<Binary Id ='CheckPID' SourceFile='$(sys.CURRENTDIR)\LicenseKeyClient_32d.dll'/>
<Binary Id ='CheckPID2' SourceFile='$(sys.CURRENTDIR)\curllib.dll'/>
<Binary Id ='CheckPID3' SourceFile='$(sys.CURRENTDIR)\libsasl.dll'/>
<Binary Id ='CheckPID4' SourceFile='$(sys.CURRENTDIR)\openldap.dll'/>
答案 0 :(得分:3)
您在二进制表中添加的文件通常在安装过程中使用临时名称提取,因此您的DLL将无法找到您在其旁边添加的其他DLL。
解决方法是将这些DLL作为普通文件添加到Temp系统文件夹中,并在安装结束时将其删除。这有一个限制,您需要将自定义操作设置为延迟,因此它在安装文件后执行,因此您的DLL将被复制到Temp文件夹。
我不知道wix是否支持temporary files,与Advanced Installer中的类似,但如果没有,您可以尝试编写自定义操作来模拟它。基本上,Advanced Installer所做的是在MSI启动时提取Temp文件夹中的那些文件,并在安装完成时删除它们。这样做的好处是,您可以使用临时文件和立即自定义操作,即在安装软件包中的文件之前。
答案 1 :(得分:2)
尽管波格丹 出色的答案,请允许我加上我的2美分:
看起来您正在处理某种形式的许可证密钥验证?最好的方法通常是在应用程序本身处理许可证密钥,除非您希望将其写入 HKLM 而不是 HKCU - 在这种情况下您可能需要临时管理员通常在安装过程中获得的权利。
您还可以在安装过程中打开HKLM密钥进行写入,并从应用程序中编写它,尽管这在安全方面通常是不受欢迎的。这允许您直接从应用程序为所有用户编写单个许可证密钥。
该应用程序具有更多灵活性和控制注册许可证密钥的过程,至关重要的是一种简单的运行方式这个过程再次。从我的角度来看,这几乎总是需要一个严肃的应用程序 - 通常是由于试用版,最终需要在试用期结束时从应用程序本身注册许可证密钥 - 而不是卸载应用程序和重新安装,或在维修/维护模式下运行设置 - 这似乎非常笨重。
我之前已经更详细地描述了这个问题:Reasons to deal with licensing in the application rather than the setup。
答案 2 :(得分:0)
我还要补充一点,WiX DTF .NET自定义操作通过允许您将内容嵌入到自解压自定义操作包中并在运行时使它们在当前目录中可用来真正简化此问题。很容易。
但是,是的,Glytzhkof是正确的。在MSI内部完成的任何许可/ DRM都很容易被击败。最好在应用程序中执行此操作,或两者都执行此操作。例如,我曾在那些分担责任的公司工作过。您可以现在或以后输入一个。我还曾在许可证密钥嵌入其中的公司工作,从而推动了功能选择。它变得很快,所以尽量不要走那条路。