【发布时间】:2012-06-06 13:44:04
【问题描述】:
我尝试在安装服务时通过 MSI 安装程序以编程方式将 dll 的引用添加到 csproj 文件中。
<Reference Include="TestProject">
<HintPath>..\..\TestProject.dll</HintPath>
</Reference>
我将添加节点的源代码下面一行放入ProjectInstaller.cs的protected override void OnAfterInstall(IDictionary savedState)
var refnode = xml.CreateElement("Reference");
var attribute = xml.CreateAttribute("Include", null);
attribute.Value = "TestProject";
refnode.Attributes.Append(attribute);
var hintPath = xml.CreateNode(XmlNodeType.Element, "HintPath", null);
hintPath.InnerText = "..\..\TestProject.dll";
refnode.AppendChild(hintPath);
xml.AppendChild(refnode);
xml.Save(file);
代码输出
<Reference Include="TestProject" xmlns="">
<HintPath>..\..\TestProject.dll</HintPath>
</Reference>
但是源代码将xmlns=""更多属性添加到Reference元素中。这段代码有什么问题,我将如何删除 xmlns="" 属性,因为 csproj 文件不采用自定义属性。
【问题讨论】:
-
据我了解,您正在尝试从安装程序中修改刚刚安装的文件?这个逻辑可以移到构建时间吗?如果是这样,就复杂性和未来的维护而言,它是可取的。
-
@YanSklyarenko:不可能,因为如果我在构建时更改 csproj,那么我的 TFSBuild 和 MSBuild 会失败。
-
好的,如果您将该 csproj 交付给最终用户,然后按照您的方式对其进行转换,您确定它会在之后编译吗?我看到您已经接受了答案,但我怀疑您选择的方式在概念上是错误的,我想帮助您。如果您分享在安装期间需要此行为的高级用例,那就太好了。
-
@YanSklyarenko:我在安装程序中向客户端提供了一个示例源代码。在项目中,我有 4 个项目参考。我将项目的源文件添加到 MSI Installer 中。现在的问题是 4 项目引用我需要将该引用转换为 dll 引用,因为项目不可用。来自 TFS 引用的项目和 dll 的当前引用我需要更改安装应用程序的应用程序文件夹中所有 dll 的引用。应用程序路径:C:\Programfiles\TestProject。源代码:C:\Programfiles\TestProject\Examples\TestProject。请指导我。等待您的回复。
-
我仍然不确定我是否理解您的意图,但听起来您在构建期间的项目文件布局与客户端的布局不同。这可以这样解决:更改构建时文件布局以反映客户端的布局,但不要将那些不需要的文件包含到 MSI 安装程序中。因此,您不必在安装时修补 *.proj 文件 - 这些文件已经包含正确的相对引用。
标签: c# xml windows-installer xmldocument csproj