在 .NET Framework 中表示 XML 的最佳做法

.NET Framework SDK命令行工具链实战指南 .NET Framework SDK 是 Windows 平台托管应用的底层构建基石,其核心在于基于 CLI 规范的中间语言(IL)编译与强名称程序集装配机制。它通过 csc、al、ildasm、ngen 等原生命令行工具,实现从源码到可部署程序集的全链路控制,支撑类型安全、版本策略、GAC 部署与 JIT/NGen 性能优化等关键能力。这类工具链虽被 .NET Core/5+ 抽象替代,但在企业级 WinForms、WPF、ASP.NET Web Forms 及旧版 WCF 系统的维护、诊断与 CI 构建 阅读详情

Dare Obasanjo

Microsoft Corporation

摘要:Dare Obasanjo 着眼于可用来表示在单个进程和 AppDomain 内的组件之间共享的、基于 XML 的数据的选项,并讨论了每种方法在设计上的利弊。

引言

在最近的一次设计审查之后,一名职位是项目经理的同事询问在 API 中公开 XML 时是否存在设计准则,因为他曾经看到过许多不同的方法,但是无法确定该选择何种方法。我告诉他,我原来相信在 MSDN 上可以找到一些准则,但是当我查阅时却只找到一段标题为 Passing XML Data Inside the CLR(英文)的 MSDN TV,其中虽然包含此类信息,但却不容易阅读。因此我萌发了这样一个念头,即为 Don Box 的 MSDN TV 片段提供一个便于打印的版本,并提供我本人在 Microsoft 处理 XML API 方面的一些经验。

准则初探

在三种主要情况下,开发人员需要考虑使用何种 API 来表示 XML。下面简要介绍一下这些情况和准则:

•

类的字段或属性中包含 XML:如果类的字段或属性是 XML 文档或片段,则该类应提供将其属性同时作为字符串和 XmlReader 进行操作的机制。

•

方法可以接受 XML 输入或返回 XML 作为输出:可以接受或返回 XML 的方法应有助于返回 XmlReader 或 XPathNavigator,除非用户希望能够编辑 XML 数据(此时应使用 XmlDocument)。

•

将对象转换成 XML:如果对象出于序列化目的要以 XML 来表示其自身,当其需要获得的 XML 序列化进程控制比 XmlSerializer 所提供的更多时,则应使用 XmlWriter。如果对象要以 XML 来表示其自身,以便能够完全以 XML 世界成员的身份参与到其中(如允许在此对象上进行 XPath 查询或 XSLT 转换),则此对象应实现 IXPathNavigable 接口。

在下面各部分中,我详细介绍了上面提到的几种情况,并解释了我是如何获得这些准则的。

常见疑点

当您决定使用方法或属性接受或返回 XML 时,您的大脑中会出现 .NET Framework 中的许多类,它们都适用于此任务。下面列出了 .NET Framework 中最适合于表示 XML 输入或输出的五个类,并且给出了其正反两方面的简要说明。

1.

System.Xml.XmlReader(英文):XmlReader 是 .NET Framework 的拉模型 XML 分析程序。在拉模型处理过程中,XML 用户通过根据需要从 XML 制造者那里请求事件来控制程序流。拉模型 XML 分析程序(如 XmlReader)以只进的流方式进行操作,同时只显示单个节点在任意给定时间的相关信息。事实上,XmlReader 不需要整个 XML 文档加载到内存并且是只读的,这使其成为以非 XML 数据源创建 XML 外观的一个不错选择。这种以非 XML 数据源创建 XML 外观的一个示例是 XmlCsvReader(英文)。有人可能将 XmlReader 的只进特性视为一种局限性,因为它使用户无法通过 XML 文档的各个部分进行多次传递。

2.

System.Xml.XPath.XPathNavigator(英文):XPathNavigator 是 XML 数据源上的只读光标。XML 光标就像是一个透镜,一次聚焦于一个 XML 节点上,但与基于拉的 API(如 XmlReader)不同,它可以在任意给定时间将光标定位在 XML 文档的任意位置。在某种程度上,拉模型 API 是光标模型的只进版本。XPathNavigator 还是以非 XML 数据实现 XML 外观的一个很好的候选项,因为它允许您以实时方式构造数据源的 XML 视图,而不必将整个数据源转换成 XML 树。使用 XPathNavigator 创建非 XML 数据的 XML 视图的一个示例是 ObjectXPathNavigator(英文)。事实上,XPathNavigator 是只读的,而且缺少一些用户友好属性(如 InnerXml(英文)和 OuterXml(英文)),这使其在需要这些功能时不如使用 XmlDocument 或 XmlNode 那样另人满意。

3.

System.Xml.XmlWriter(英文):XmlWriter 提供了将 XML 文档推入基本存储区的一般机制。该基本存储区可以是从文件(如果使用的是 XmlTextWriter)到 XmlDocument(如果使用的是 XmlNodeWriter(英文))的任何内容。使用 XmlWriter 作为返回 XML 的方法的参数为支持各种可能的返回类型(包括文件流、字符串和 XmlDocument 实例)提供了一种可靠方式。这就是为什么 XmlSerializer.Serialize() method(英文)接受 XmlWriter 作为其中一个重载上的参数。正如其名称所包含的意思,XmlWriter 只对编写 XML 有用,不能用于读取或处理 XML。

4.

System.Xml.XmlDocument/XmlNode(英文):XmlDocument 是 W3C Document Object Model (DOM)(英文)的实现。DOM 是由 XmlNode 对象的分层树所构成的 XML 文档在内存中的表示,这些对象代表 XML 文档的逻辑组件,如元素、属性和文本节点。DOM 是在 .NET Framework 中操作 XML 的最流行的 API,因为它提供了一种直接的方法来加载、处理和保存 XML 文档。DOM 的主要缺陷是其设计需要将整个 XML 文档加载到内存中。

5.

System.String(英文):XML 是一种基于文本的格式,而且比 String 类能更好地表示文本。使用字符串作为 XML 表示方法的主要优点在于字符串是最小公分母。字符串容易写入日志文件或打印到控制台,而且如果您要使用 XML API 对 XML 进行实际处理,则可以将字符串加载到 XmlDocument 或 XPathDocument 中。使用字符串作为利用 XML 的方法或属性的主要输入或输出存在几个问题。使用字符串的第一个问题类似于 DOM,它们都需要将整个 XML 文档加载到内存中。其次,以字符串表示 XML 会增加制造者生成 XML 字符串的负担,在某些情况下这可能非常麻烦。生成 XML 字符串可能非常麻烦的一个示例就是从 XmlReader 或 XPathNavigator 获得 XML 时。第三,以字符串表示 XML 可能会导致与字符编码相关的混乱,因为无论在 XML 中放入什么编码声明,.NET Framework 中的字符串始终是 UTF-16 字符编码。最后,以字符串表示 XML 使得创建 XML 处理管道较为困难,因为管道中的每一层都必须重新分析文档。

类的字段或属性中包含 XML

在某些情况下,对象的字段或属性可能是一个 XML 文档或 XML 片段。下面的示例类代表一封电子邮件,其内容是 XHTML。邮件的 XML 内容是以字符串表示的,并且由该类的 Body 属性公开:

public class Email{  
  private string from;
  public string From{
    get { return from; }
    set {from = value; }
  }
  private string to;
  public string To{
    get { return to; }
    set {to = value; }
  }
  private string subject;
  public string Subject{
    get { return subject; }
    set {subject = value; }
  }
  private DateTime sent;
  public DateTime Sent{
    get { return sent; }
    set {sent = value; }
  }
  private XmlDocument body = new XmlDocument(); 
  public string Body{
    get { return body.OuterXml; }
    set { body.Load(new System.IO.StringReader(value));}
  }    
}

使用字符串作为表示 XML 文档的字段或属性的主要表示方式是最具用户友好性的表示方式,因为 System.String 类是一般开发人员最熟悉的 XML“常见疑点”。但是,这将会增加使用该类的用户的负担,这些用户现在可能必须应付两次分析 XML 文档的成本。例如,设想一种情况:在从 SqlCommand.ExecuteXmlReader() method(英文)或 XslTransform.Transform() method(英文)所得到的 XML 中设置了这样一个属性。在这种情况下,用户将必须分析文档两次,如下例所示:

     Email email   = new Email(); 
    email.From    = "dareo@example.com"; 
    email.To      = "michealb@example.org"; 
    email.Subject = "Hello World"; 

    XslTransform transform = new XslTransform(); 
    transform.Load("format-body.xsl"); 

    XmlDocument body = new XmlDocument(); 
    //1. XML 由 XmlDocument.Load() 分析
    body.Load(transform.Transform(new XPathDocument("body.xml"), null));

    //2. 同一 XML 被 Email.Body 属性中的 XmlDocument.Load() 再次分析
email.Body = body.OuterXml;

在上例中,同一 XML 被分析了两次,因为在将该 XML 转换成字符串之前必须将其从 XmlReader 加载到 XmlDocument 中,然后使用该 XML 设置 Email 类的 Body 属性,再由该属性本身从内部将该 XML 分析为 XmlDocument。一条很有效的经验法则就是提供对 XML 属性的访问(作为 XmlReader 和字符串)。因此,还应将下列方法添加到 Email 类,以使该类的用户获得最大的灵活性:

public void SetBody(XmlReader reader){
    body.Load(reader); 
  }

  public XmlReader GetBody(){
    return new XmlNodeReader(body); 
  }

这为 Email 类的用户提供了一种方式,使这些用户在需要时能够以有效的方式传递、设置和检索 Body 属性中的 XML 数据。

准则 如果类的字段或属性是 XML 文档或片段,则该类应提供将其属性同时作为字符串和 XmlReader 进行操作的机制。

敏锐的读者可能会注意到,如果您直接将 XmlDocument 作为属性公开,则应满足该准则,还应使该属性的用户可以精确更改 XML。

方法可以接受 XML 输入或者返回 XML 作为输出

当设计生成或使用 XML 的方法时,开发人员有责任使这样的方法在接受输入时具有灵活性。当方法接受 XML 作为输入时,您可以将这些方法分为要求在适当位置修改数据的方法,以及只需对 XML 进行只读访问的方法。唯一一个支持读写访问的“XML 常见疑点”是 XmlDocument。下面的代码示例显示了这样一个方法:

public void ApplyDiscount(XmlDocument priceList){
    foreach(XmlElement price in priceList.SelectNodes("//price")){
      price.InnerText = (Double.Parse(price.InnerText) * 0.85).ToString();      
    }
  }

对于需要对 XML 进行只读访问的方法,有两个主要选项:

•

XmlReader

•

XPathNavigator

XmlReader 提供了对 XML 的只进访问,而 XPathNavigator 不但提供了对基本 XML 源的随机访问,还提供了对数据源执行 XPath 查询的能力。以下代码示例将打印下面的 XML 文档中的 artist(艺术家)和 title(标题):

<items>
    <compact-disc>
      <price>16.95</price>
      <artist>Nelly</artist>
      <title>Nellyville</title>
    </compact-disc>
    <compact-disc>
      <price>17.55</price>
       <artist>Baby D</artist>
       <title>Lil Chopper Toy</title>
    </compact-disc>
  </items>

XmlReader:

public static void PrintArtistAndPrice(XmlReader reader){
    reader.MoveToContent(); //move from root node to document element (items)
    /* 保持读取,直至获得第一个 <artist> 元素 */
    while(reader.Read()){

      if((reader.NodeType == XmlNodeType.Element) && reader.Name.Equals("artist")){

        artist = reader.ReadElementString();
        title  = reader.ReadElementString(); 
        break; 
      }
    }
    Console.WriteLine("Artist={0}, Title={1}", artist, title);
  }
}

XPathNavigator:

public static void PrintArtistAndPrice(XPathNavigator nav){

    XPathNodeIterator iterator = nav.Select("/items/compact-disc[1]/artist 
       | /items/compact-disc[1]/title");

    iterator.MoveNext();
    Console.WriteLine("Artist={0}", iterator.Current);

    iterator.MoveNext();
    Console.WriteLine("Title={0}", iterator.Current);
  }

通常,返回 XML 的方法都使用类似的规则。如果希望接收方编辑 XML,则应返回 XmlDocument。否则,应根据方法是否需要提供对 XML 数据的只进流式访问而返回 XmlReader 或 XPathNavigator。

准则 接受或返回 XML 的方法应有助于返回 XmlReader 或 XPathNavigator,除非用户希望能够编辑 XML 数据(此时应使用 XmlDocument)。

上述准则的意思是指返回 XML 的方法应有助于返回 XmlReader,因为它比其他任何类型都适用于更多用户的情况。此外,当方法的调用方需要更多功能时,它们可以从返回的 XmlReader 加载 XmlDocument 或 XPathDocument。

将对象转换为 XML

XML 作为信息交换的通用语言已无所不在,这使其成为要以 XML 表示自身的某些对象的显而易见的选择,这些对象或者是出于序列化目的,或者是为了获得对其他 XML 技术的访问(如使用 XPath 进行查询或使用 XSLT 进行转换)。

当出于序列化目的将对象转换成 XML 时,显然应选择使用 XML Serialization technology in the .NET Framework(英文)。但是,在某些情况下,您对生成的 XML 所需的控制可能比 XmlSerializer 所能提供的更多。在这种情况下,工具包中的 XmlWriter 便是一个很有用的类,因为它使您不再需要该类的结构与所生成的 XML 之间存在一对一映射。下例显示了通过使用 XmlWriter 序列化 Email 类(前面几部分中已经提到)而生成的 XML。

public void Save(XmlWriter writer){

    writer.WriteStartDocument(); 
    writer.WriteStartElement("email"); 
    writer.WriteStartElement("headers");

    writer.WriteStartElement("header");
    writer.WriteElementString("name", "to"); 
    writer.WriteElementString("value", this.To); 
    writer.WriteEndElement(); //标题

    writer.WriteStartElement("header");
    writer.WriteElementString("name", "from"); 
    writer.WriteElementString("value", this.From); 
    writer.WriteEndElement(); //标题

    writer.WriteStartElement("header");
    writer.WriteElementString("name", "subject"); 
    writer.WriteElementString("value", this.Subject); 
    writer.WriteEndElement(); //标题
    
    writer.WriteStartElement("header");
    writer.WriteElementString("name", "sent"); 
    writer.WriteElementString("value", XmlConvert.ToString(this.Sent)); 
    writer.WriteEndElement(); //标题

    writer.WriteEndElement(); //标题;
    
    writer.WriteStartElement("body");
    writer.WriteRaw(this.Body); 

    writer.WriteEndDocument(); //关闭所有打开的标记
  }

这段代码生成下面的 XML 文档

<email>
  <headers>
    <header>
      <name>收件人</name>
      <value>michealb@example.org</value>
    </header>
    <header>
      <name>发件人</name>
      <value>dareo@example.com</value>
    </header>
    <header>
      <name>主题</name>
      <value>Hello World</value>
    </header>
    <header>
      <name>发送时间</name>
      <value>2004-03-05T15:54:13.5446771-08:00</value>
    </header>
  </headers>
  <body><p>Hello World 是我最喜欢的示例应用程序。</p></body>
</email>

只使用 XmlSerializer 的基本功能将不可能生成上面的 XML 文档。XmlWriter 的另一个优点是它可以从基本目标提取到数据要写入的目标,因此它可以是从磁盘上的文件到内存中的字符串(甚至是 XmlNodeWriter(英文)的 XmlDocument 称谓)的任何内容。

如果要求提供一种方式,使类可以更完全地参与到 XML 世界中(如与XPath 或 XSLT 等 XML 技术进行交互),则该类的最佳选择是实现 IXPathNavigable 接口,并为该类提供 XPathNavigator。这样做的一个示例是 ObjectXPathNavigator,它为那些使您可以在上述对象上执行 XPath 查询或运行 XSLT 转换的任意对象提供了 XML 视图。

准则 如果对象出于序列化目的要以 XML 来表示其自身,当其需要获得的 XML 序列化过程控制比 XmlSerializer 所提供的更多时,则应使用 XmlWriter。如果对象要以 XML 来表示其自身,以便能够完全以 XML 世界成员的身份参与到其中(如允许在此对象上进行 XPath 查询或 XSLT 转换),则此对象应实现 IXPathNavigable 接口。

结论

在将来的 .NET Framework 版本中,将会更加强调基于光标的 XML API(如由 IXPathNavigable 接口公开的 XPathNavigator)。这类光标将成为与 .NET Framework 中的 XML 进行交互的主要机制。

Dare Obasanjo 是 Microsoft WebData 小组的成员,除其他事务外,该小组还开发了 .NET Framework 的 System.Xml 和 System.Data 命名空间、Microsoft XML 核心服务 (MSXML) 以及 Microsoft 数据访问组件 (MDAC) 中的组件。

有关本文的任何问题或评论,欢迎张贴到 GotDotNet 上的 Extreme XML 留言板。

从.NET Framework迁移到.NET 6/8?先搞懂Standard、Framework、Core的恩怨情仇 本文详细解析了从.NET Framework迁移到.NET 6/8的技术路线,重点探讨了.NET Standard、.NET Framework和.NET Core的关系与兼容性。通过实战案例和迁移策略,帮助开发者高效完成技术升级,享受性能提升和现代化特性带来的红利。 阅读详情

相关推荐

在.NET Framework中高效处理XML数据 C#

在.NET Framework中,我们可以轻松地处理XML数据,并对其进行解析、创建和修改。通过以上示例,我们可以看到在.NET Framework中处理XML数据是相当简单和灵活的。我们可以使用提供的类和方法来解析、创建、修改和查询XML数据。希望本文能帮助您理解在.NET Framework中高效处理XML数据的基本概念和技术。要创建和修改XML数据,我们可以使用XmlDocument和XmlNode类的方法和属性。要查询和筛选XML数据,我们可以使用XPath表达式或LINQ to XML。

2301_79366332的博客 428

在 .NET Framework 中表示 XML 的最佳做法! (不错,摘自MSDN)

在 .NET Framework 中表示 XML 的最佳做法发布日期: 8/25/2004 | 更新日期: 8/25/2004Dare ObasanjoMicrosoft Corporation摘要:Dare Obasanjo 着眼于可用来表示在单个进程和 AppDomain 内的组件之间共享的、基于 XML 的数据的选项,并讨论了每种方法在设计上的利弊。引言在最近

MyNoName的专栏 1572

.NET Framework 2.0 安装包:开发环境升级指南

NET Framework 2.0是微软于2005年发布的一个重大更新,它为开发者带来了大量的改进和新特性。作为.NET Framework系列的一个重要里程碑,它不仅为现代Web应用和Windows应用提供了更加完善的开发平台,还为IT专业人员带来了更多提升效率和性能的机会。在这一版本中,微软引入了泛型编程概念,显著提高了代码的重用性并增强了类型安全。此外,对异常管理和性能优化方面的改进也为开发者提供了更好的调试和部署体验。

weixin_42372837的博客 1957

.net 程序发布后xml文件找不到的两种解决方法

自己做项目需要用智能客户端发布,我遇到了个问题就是程序中的xml文件在发布后找不到了。经过在网上查询和自己的试验发现这两个方法都可以解决这个问题。 方法1     右键winUI项目,发布-〉应用程序文件....->选择xml文件-〉发布状态改为“数据文件(自动)”        在程序里取xml路径的写法     file = Application.Common

lgx的专栏 3404

QST QMC5883L —— 经典磁传感器的生存指南与替代预案

本文聚焦于QST旗下经典三轴磁力计 QMC5883L,解析其技术渊源、核心特性及当前面临的停产风险。结合真实应用场景提供续命方案与选型建议,为依赖该芯片的开发团队争取过渡时间窗口期。文章包含实测数据对比、生命周期管理策略及潜在替代方案拆解。存续价值判断✔️ 现有产品设计无需大幅改动即可延续生命;❌ 新项目采用将面临更高的维护成本;⚠️ 建议在6个月内完成技术路线切换。#磁传感器 #嵌入式开发 #供应链管理 #QST #QMC5883L。

2501_93066786的博客 997

5分钟搞懂Paris公式:如何用裂纹扩展速率预测零件寿命(附Python代码示例)

本文详细介绍了Paris公式在裂纹扩展速率预测零件寿命中的应用,通过Python代码示例展示了从理论到实践的完整流程。文章涵盖了Paris公式的工程本质、寿命预测计算流程、几何修正因子选择以及实际案例演示,帮助工程师快速掌握这一关键技术。

weixin_29309475的博客 426

.netframework下的XML标准支持

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4  <!-- /* St

lffxgthmhfy的专栏 617

用PyTorch实战清华SSVEP数据集:手把手教你搭建第一个脑机接口分类模型(附完整代码)

本文详细介绍了如何使用PyTorch实战清华大学SSVEP数据集,从数据预处理到CNN模型构建的全流程。通过手把手教学,帮助读者搭建第一个脑机接口分类模型,特别针对数据维度转换等关键难点提供可视化解析,并附完整代码实现。

weixin_42566121的博客 349

在.NET Framework中轻松处理XML数据(转)

在.NET Framework中轻松处理XML数据(二)分析属性值大部分情况下,属性值都是一个简单的文本字符串。然而,这并不意味着实际应用中的属性值都是字符型的。有时候,属性值是由许多种类型的数据组合而成的,例如Date或Boolean,这时,你就要用XmlConvert或System.Convevt类的方法把这些类型转换成原来的类型。XmlConvert和System.Convevt

Neo in SAP 1564

autodl云服务器使用中的conda源报错

通过find path -name filename找到.condarc文件,在autodl服务器中,一般在/root/.condarc。为了利用jypyter打开conda虚拟环境运行,需要下载ipykenel。这个报错是源的问题,在通过源获取包元数据时出现了HTTP 429错误。通过conda换源解决。修改.condarc文件,命令: vim .condarc。但这样还不能解决问题,得把报错中有问题的源注释掉。通过以下命令添加清华镜像源。把报错的链接源注释如下。

Ty_kilig的博客 1584

Allegro如何设置走线自动删除重复走线操作指导

Allegro如何设置走线是自动删除重复走线操作指导在PCB布线的时候,点到点需要重复走一段线的时候,希望原来的线段自动被删除,Allegro设计的时候支持这个操作如下图,重复走中间的线段的时候,希望下方的走线自动删除具体操作如下This section is describe what the function allegro have ,helpfully could let user know more about allegroAllegro Design and Analysis includes

weixin_54787054的博客 4497

.net下操作XML的几篇文章(downmoon收集自MSDN)

1、通过 XML 发布新闻  http://msdn.microsoft.com/zh-cn/library/ms947599.aspx 2、真实世界的 XML:使用 .NET 框架中集成的读取器和写入器很容易操作 XML 数据 http://msdn.microsoft.com/zh-cn/library/aa686057.aspx 3、在 .NET Framework 中表示 XML ...

weixin_34209851的博客 67

太阳敏感器:卫星姿态控制的“指南针

在卫星姿态控制系统中,太阳敏感器(Sun Sensor) 是至关重要的光学姿态敏感器之一。它通过探测太阳光的方向,为卫星提供关键的姿态参考信息,确保卫星能够正确调整自身方位,维持稳定的对日定向,保障能源供应和任务执行。

ScilogyHunter的博客 1730

.NET Framework 精简版后台处理技术

摘要:执行后台处理牵涉到很多方面,要求非常仔细地进行设计。本文提供了一些有关充分利用后台处理的建议,并提出了很多必须解决的问题。   简介   应用程序通常需要在后台执行长时间运行的操作,同时还要提供积极的、响应及时的用户体验。这种情况在智能设备开发过程中最为常见。Pocket PC 上运行的应用程序必须能够随时执行用户所需的任务,但是,由于此类设备的 CPU 处理能力通常都有限,而且

u011877729的专栏 691

通过分子模板构建随机分布在溶液中的纳米颗粒(一)

通过分子模板构建随机分布在溶液中的纳米颗粒 要实现的目标: 1、可以循环建立多个水分子溶液的模型; 2、针对不同水分子数,自动创建文件夹; 3、运行完毕将所有结果自动存储在对应文件夹里; 分子模板的具体教程请见我的博客: https://blog.csdn.net/qq_43689832/article/details/104443175 1、首先,我们先建立纳米颗粒的分子模板,命名为p_30.txt: 包括两种原子类型。具体格式如下: # LAMMPS molecule file makin.

Rockyoung 2650

把数据库事务边界握在手里:ABAP 里的 COMMIT CONNECTION 与 ROLLBACK CONNECTION 深度拆解

与表面是两条很短的语句,背后却牵动了连接管理、数据库 LUW、SAP LUW、隐式提交、游标生命周期、GTT 平台差异等一整片工程现实。把它们用对,你就能在不破坏主业务事务的前提下,实现跨库写入、审计落库、隔离型日志、数据集成落地等一系列“看似矛盾”的目标;用错了,它们也会悄无声息地制造一致性缺口,让问题在高峰期以 dump 或数据异常的方式爆出来。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1837

[转载]如何提高.NET Compact Framework应用程序的性能 - 黎波 - 博客园

[转载]如何提高.NET Compact Framework应用程序的性能 以下编程做法可以节省内存和改善设备应用程序的性能。 使用 Windows 窗体和图形节省内存 对提供 BeginUpdate 和 EndUpdate 方法的控件使用这两种方法,提供这两种方法的控件包括 ComboBox、ListBox、ListView、ToolStripComboBox 和 TreeView。 ...

weixin_30402343的博客 137

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

WinForms ModernUI跨平台兼容性指南:从.NET Framework 2.0到.NET Core 3.1的完整迁移方案

想要为您的Windows Forms应用程序添加现代化的Metro UI界面吗?WinForms ModernUI(又称MetroFramework)是一个功能强大的开源UI框架,它完美支持从传统的.NET Framework 2.0到现代的.NET Core 3.1的完整迁移路径。这个完整的跨平台兼容性指南将帮助您轻松实现UI框架的平滑升级,让您的应用程序焕然一新!🚀 ## 📋 为什么选择

gitblog_00543的博客 539

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

在.NET里更好的创建XML文档

<!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"

zgqtxwd的专栏 362

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Net Framework 框架工作原理

引:http://hi.baidu.com/puzi0315/blog/item/bd518f810940c1d4bd3e1e22.html 从.Net Framework 1.0到现在的.Net Framework 4.0,版本在不断升级,那么,这些版本升级了什么东西?在哪些方面进行了增加或者增强?它们之间有什么相同之处和不同之处呢?   .Net Framework从出现到现在的.Net ...

weixin_30294021的博客 212

Microsoft .NET Framework 精简版后台处理技术(转)

适用于: Microsoft® .NET Framework 精简版 Microsoft® Visual Studio® .NET 2003摘要:执行后台处理牵涉到很多方面,要求非常仔细地进行设计。本文提供了一些有关...

cuankuangzhong6373的博客 288

从.NET Framework到.NET 8:pyRevit 5架构迁移深度解析与性能优化指南

你是否曾在Revit插件开发中遭遇过以下困境?加载速度缓慢导致设计师抱怨影响工作流,多版本兼容性问题让IT团队焦头烂额,老旧框架限制了功能扩展的可能性。作为Autodesk Revit®平台上最受欢迎的Rapid Application Development (RAD)环境,pyRevit 5版本的发布标志着一场从.NET Framework到.NET 8的技术革命。本文将深入剖析这一重大架构迁...

gitblog_07567的博客 526

ILRepack:为什么这个开源工具是.NET程序集合并的最佳选择?

在.NET开发的世界中,随着项目规模的增长,依赖管理逐渐成为开发者的痛点之一。想象一下,一个典型的.NET应用程序可能需要引用数十个甚至上百个程序集,每个程序集都是一个独立的DLL文件。这不仅增加了部署复杂度,还可能导致版本冲突和依赖地狱。ILRepack正是为了解决这一难题而生的开源工具,它能够将多个.NET程序集合并为一个单一的程序集,让您的应用程序部署变得更加简洁高效。作为ILMerge和M

gitblog_00627的博客 309
上一篇: VS.NET中构建数据库应用程序
下一篇: 返回单行实体的数据操作
slightboy
博客等级 码龄23年 3粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值