我正在使用Wix,我必须将一个新的dll(比如New.dll)作为MSI安装的一部分放入GAC中的某个特定路径,其中一些其他dll已经存在。(假设是Exisiting.dll。请注意这个DLL在安装我的MSI之前就存在了。 那么我有没有办法实现这一目标?请注意New.dll包含本机代码,而不是.net程序集。感谢。
答案 0 :(得分:3)
GAC仅适用于强名称程序集中的文件。程序集是一组版本化文件,其中一个文件具有清单。创建多文件程序集很简单,但大多数工具既不帮助创建也不尊重程序集可能包含多个文件。基本工具是程序集链接器。请参阅How to: Build a Multifile Assembly。
可以将本机DLL作为C#编译器的/linkresource开关的程序集的一部分。如果你想摆弄一个C#项目文件,你可以使用自己的标准编译目标和Csc任务覆盖链接资源。
WiX无法处理多文件程序集。您必须为程序集中的每个文件创建File元素。所有这些文件应该在同一个组件中。这是一个在Organizing Applications into Components时使单个组件有意义的实例。
如果想要一个不同的行为(即替换其中一个文件),则必须创建一个新版本的程序集/组件。希望这就是以前的本机DLL首先进入GAC的方式。
答案 1 :(得分:1)
我几年前才这样做过。我99%确定new.dll将是old.dll的伴随文件。换句话说,old.msi有一个使用old.dll作为密钥文件的组件。必须将new.dll作为附加文件添加到此组件,以便MsiPublishAssemblies / Fusion API可以将它们一起直接发布到同一存储中。
如果您同步组件ID(GUID)并将其标记为共享组件,则可以在new.msi中执行此操作。您必须使用相同的强名称(和AssemblyVersion)重建old.dll,但使用更高的AssemblyFileVersion / Win32文件版本。
MSI组件规则要求较新的DLL向后兼容。这对GAC来说是双倍的。这似乎是对old.dll的重大改变。修改AssemblyVersion并将其定义为一个完整的新组件并在GAC中并排安装可能是有意义的。
答案 2 :(得分:0)
您要做的第一件事是在系统上搜索文件......您可以使用FileSearch WiX语句执行此操作:
<Property Id="PROPFILESEARCHEXISTINGDLL" Secure="yes">
<DirectorySearch Id="EXISTINGDLLFOLDERPATH" Path="[WindowsFolder]\assembly\" Depth="5">
<FileSearch Name="Existing.dll"/>
</DirectorySearch>
</Property>
DirectorySearch参考:http://wixtoolset.org/documentation/manual/v3/xsd/wix/directorysearch.html FileSearch参考:http://wixtoolset.org/documentation/manual/v3/xsd/wix/filesearch.html
这将把文件的完整路径放在PROPFILESEARCHEXISTINGDLL属性中。从这里,您可以在将文件放在磁盘上时引用此属性。 (假设您当然有权写入该位置......)