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値で明示的に示すと、Xmlライターはそれぞれのドキュメントフラグメントのデフォルトの名前空間をオーバーライドします。Include

次のように属性を作成してみてください。

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

HintPath同じことが、数行下の要素の作成にも当てはまります。

于 2012-06-06T13:54:11.783 に答える