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

How can I convert this InstallScipt code to C#?

我正在使用 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;
        }

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

代码大致如下(未经测试,凭记忆输入)

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

.NET Framework 的 System.Xml.XmlDocument object gives you the same behavior as the Microsoft.XMLDOM COM objects, as described in 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);

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

但是,如果您 XML 包含异地托管的 DTD 引用,并且解析这些 DTD 引用需要很长时间。这通常是 validateOnParse 被关闭的原因。如果您需要这样做,您需要使用重载的 Load 方法和您自己的 reader。您可以像这样关闭解析 DTD 引用的位:

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

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