如何将此InstallScipt代码转换为C#?

时间:2015-02-24 11:41:55

标签: c# installscript installscript-msi

我使用DTF(Microsoft部署基础)命名空间将我的InstallScript自定义操作转换为托管自定义操作。有一段InstallScript代码,我在转换到C#时遇到了麻烦,我需要做一些XML文件操作。原始的InstallScript代码如下所示。我的代码是我到目前为止转换它的方式。是否有更好的方法来转换它,以便我可以利用点符号(Intellisense)而不是让XML文档对象延迟。

    set oDoc = CoCreateObject("Microsoft.XMLDOM");
    if (IsObject(oDoc)) then
        oDoc.async = FALSE;
        oDoc.validateOnParse = FALSE;
        oDoc.resolveExternals = FALSE;
        oDoc.preserveWhiteSpace = VARIANT_TRUE;

        oDoc.load(szCryptomaticConfigFile);

        szXPath = CRYPTOMATIC_SETTINGS_PATH;
        set oSettingsNode = oDoc.selectSingleNode(szXPath);

        szValue = CRYPTOMATIC_SETTINGS_VALUE;
        oSettingsNode.nodeTypedValue = szValue;

        oDoc.Save(szCryptomaticConfigFile);
   endif;

我的转换

        dynamic oXMLDOMDoc = Activator.CreateInstance(Type.GetTypeFromProgID("Microsoft.XMLDOM"));
        if (oXMLDOMDoc != null)
        {
            oXMLDOMDoc.async = false;
            oXMLDOMDoc.validateOnParse = false;
            oXMLDOMDoc.preserveWhiteSpace = VARIANT_TRUE;
            oXMLDOMDoc.load(szCryptomaticConfigFile);

            string szXPath = CRYPTOMATIC_SETTINGS_PATH;
            dynamic oSettingsNode = oXMLDOMDoc.selectSingleNode(szXPath);

            string szXValue = CRYPTOMATIC_SETTINGS_VALUE;
            oSettingsNode.nodeTypedValue = szXValue;

            oXMLDOMDoc.Save(szCryptomaticConfigFile);
            return ActionResult.Success;
        }
        else
        {
            return ActionResult.Failure;
        }

2 个答案:

答案 0 :(得分:1)

是的,这只是打开一个XmlDocument,找到一个特定节点并在再次保存文件之前更新其值。

代码是(未经测试,从内存中输入)

var xml = new XmlDocument();
xml.Load(szCryptomaticConfigFile);
var node = xml.SelectSingleNode(szXPath);
node.Value = CRYPTOMATIC_SETTINGS_VALUE
xml.Save(szCryptomaticConfigFile);

答案 1 :(得分:0)

.NET Framework的System.Xml.XmlDocument对象为您提供与Microsoft.XMLDOM COM对象相同的行为,如this MSDN article中所述。

在这种情况下,您的代码看起来像这样:

var xml = new XmlDocument();
xml.PreserveWhiteSpace = true;
xml.Load(szCryptomaticConfigFile);

string szXPath = CRYPTOMATIC_SETTINGS_PATH;
var settingsNode = xml.selectSingleNode(szXPath);

string szXValue = CRYPTOMATIC_SETTINGS_VALUE;
settingsNode.InnerText = szXValue;

xml.Save(zzCryptomaticConfigFile);

需要注意的是,许多加载/保存选项都已消失。这些不再设置在顶级XmlDocument上。相反,这些是XmlTextReader上用于保存和加载文档的设置。默认情况下,Load()方法是同步和验证的。通常这就是你想要的。

但是,如果XML包含异地托管的DTD引用,则需要很长时间才能解析这些DTD引用。这通常是关闭validateOnParse的原因。如果您需要这样做,则需要在自己的阅读器上使用重载的Load方法。您可以关闭解析DTD引用的位,如下所示:

var settings = new XmlReaderSettings();
settings.XmlResolver = null;
settings.ProhibitDtd = false;

var reader = XmlTextReader.Create(szCryptomaticConfigFile, settings);
xml.Load(reader)