0

我尝试通过 MSI 安装程序在安装服务时以编程方式将 dll 的引用添加到 csproj 文件中。

<Reference Include="TestProject">
    <HintPath>..\..\TestProject.dll</HintPath>
</Reference>


protected override void OnAfterInstall(IDictionary savedState)我在 ProjectInstaller.cs中添加节点的源代码行放在下面

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 文件不采用自定义属性。

4

3 回答 3

2

C# 项目文件的默认命名空间是xmlns="http://schemas.microsoft.com/developer/msbuild/2003". 您没有指定任何名称空间,因此必须清除名称空间才能添加您想要的子项。设置正确的命名空间,你可能不会有问题。

var ns = "http://schemas.microsoft.com/developer/msbuild/2003";
var refnode = xml.CreateElement("Reference", ns);
var attribute = xml.CreateAttribute("Include", ns);
attribute.Value = "TestProject";
refnode.Attributes.Append(attribute);
var hintPath = xml.CreateNode(XmlNodeType.Element, "HintPath", ns);
hintPath.InnerText = "..\..\TestProject.dll";
refnode.AppendChild(hintPath);
xml.AppendChild(refnode);
xml.Save(file);
于 2012-06-06T13:54:29.383 回答
1

虽然这不是原始问题的答案,但我想分享我认为更好的做法,因为我看到了问题背后的设计问题。

在交付软件时,应该更喜欢构建时复杂性而不是安装时复杂性。

第一个完全在开发人员的控制之下,那个阶段的错误不是那么严重,可以测试。该问题很可能会在对最终用户造成损害之前被发现。

后者对目标系统的影响更大。您永远不知道您安装到的确切环境。你不能从字面上依赖任何东西。而那个阶段的错误成本更高,并且随着人们下载您的软件而在眨眼间传播开来。

因此,重复我自己,更喜欢构建时复杂性而不是安装时复杂性。安装程序不应该修复应用程序本身的设计问题。仅将那些您在构建期间无法猜测的内容留给安装时间。

在您的特定情况下,我想您可以在构建期间修改项目布局,以免使用 DLL 引用修补项目文件。教你的构建系统只在 MSI 包中包含必要的东西。

希望这可以帮助。

于 2012-06-07T12:15:09.527 回答
0

在您的var attribute = xml.CreateAttribute("Include", null);行中,您创建没有附加命名空间 URI 的属性。但是,在 MSBuild 文件中,默认命名空间(无命名空间前缀)通常设置为xmlns="http://schemas.microsoft.com/developer/msbuild/2003". 当您用您的null值明确指出该Include属性与该名称空间无关时,Xml 编写器会覆盖相应文档片段的默认名称空间。

尝试像这样创建您的属性:

var attribute = xml.CreateAttribute("Include", "http://schemas.microsoft.com/developer/msbuild/2003");

这同样适用于在HintPath下面几行创建元素。

于 2012-06-06T13:54:11.783 回答