﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="https://community.devexpress.com/feed-stylesheets/rss.xsl" media="screen"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dx="https://www.devexpress.com/" xmlns:a10="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title>Developer Express Inc.</title>
    <link>https://community.devexpress.com/Blogs</link>
    <description>Microsoft ASP.NET, WinForms Controls, Delphi &amp; C++ VCL Controls, Visual Studio IDE Productivity Tools &amp; Application Frameworks. WPF &amp; Reporting
Got questions? Email us: info@DevExpress.com</description>
    <language>en-US</language>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:388288</guid>
      <link>https://community.devexpress.com/Blogs/news/archive/2026/06/02/devexpress-developer-survey-ai-impact-security-accessibility-compliance-upgrade-other-product-experience.aspx</link>
      <category domain="https://community.devexpress.com/Tags/Accessibility">Accessibility</category>
      <category domain="https://community.devexpress.com/Tags/ai">ai</category>
      <category domain="https://community.devexpress.com/Tags/Compliance">Compliance</category>
      <category domain="https://community.devexpress.com/Tags/Featured">Featured</category>
      <category domain="https://community.devexpress.com/Tags/installation">installation</category>
      <category domain="https://community.devexpress.com/Tags/licensing">licensing</category>
      <category domain="https://community.devexpress.com/Tags/security">security</category>
      <category domain="https://community.devexpress.com/Tags/Survey">Survey</category>
      <category domain="https://community.devexpress.com/Tags/upgrade">upgrade</category>
      <category domain="https://community.devexpress.com/Tags/ux">ux</category>
      <title>DevExpress Developer Survey — AI Impact, Regulatory Compliance, Upgrade &amp; General Product Experience</title>
      <description>&lt;p&gt;As always, we thank you for your continued support and for choosing DevExpress for your software development needs.&lt;/p&gt;&lt;p&gt;Below is&amp;nbsp;an important usage survey and we ask that you take a few minutes to submit your feedback to us. Your thoughts/comments will help us shape our future R&amp;amp;D efforts so they better align with your development objectives.&amp;nbsp;&lt;span&gt;The survey should take&amp;nbsp;&lt;/span&gt;&lt;strong&gt;about 10 minutes&lt;/strong&gt;&lt;span&gt;&amp;nbsp;to complete.&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The focus of this survey is as follows:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;AI-assisted development and its impact on your enterprise&lt;/li&gt;&lt;li&gt;Regulatory compliance requirements in an ever-changing regulatory landscape&lt;/li&gt;&lt;li&gt;Satisfaction with DevExpress product delivery model and licensing&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Your Feedback Matters!&lt;/h2&gt;
&lt;div data-survey-id="67e5b107-c501-4b6b-9d32-727b9d7a3577" data-survey-auth-required="true"&gt;&lt;/div&gt;
&lt;p&gt;&lt;span&gt;Thanks,&lt;/span&gt;&lt;br&gt;&lt;span&gt;Dennis Garavsky&lt;/span&gt;&lt;br&gt;&lt;span&gt;Principal Product Manager&lt;/span&gt;&lt;br&gt;&lt;a href="mailto:dennis@devexpress.com" title="Email me if you have questions or suggestions"&gt;dennis@devexpress.com&lt;/a&gt;&lt;br&gt;&lt;/p&gt;</description>
      <pubDate>Tue, 02 Jun 2026 07:08:00 Z</pubDate>
      <dc:creator>Dennis Garavsky (DevExpress)</dc:creator>
    </item>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:388291</guid>
      <link>https://community.devexpress.com/Blogs/xaf/archive/2026/06/01/xaf-blazor-winforms-ui-case-study-by-datawerkes-field-services-management-platform-timewerkes.aspx</link>
      <category domain="https://community.devexpress.com/Tags/Audit">Audit</category>
      <category domain="https://community.devexpress.com/Tags/bi">bi</category>
      <category domain="https://community.devexpress.com/Tags/blazor">blazor</category>
      <category domain="https://community.devexpress.com/Tags/case+study">case study</category>
      <category domain="https://community.devexpress.com/Tags/charts">charts</category>
      <category domain="https://community.devexpress.com/Tags/Dashboards">Dashboards</category>
      <category domain="https://community.devexpress.com/Tags/LOB">LOB</category>
      <category domain="https://community.devexpress.com/Tags/lowcode">lowcode</category>
      <category domain="https://community.devexpress.com/Tags/PivotGrid">PivotGrid</category>
      <category domain="https://community.devexpress.com/Tags/rad">rad</category>
      <category domain="https://community.devexpress.com/Tags/reporting">reporting</category>
      <category domain="https://community.devexpress.com/Tags/Reports">Reports</category>
      <category domain="https://community.devexpress.com/Tags/scheduler">scheduler</category>
      <category domain="https://community.devexpress.com/Tags/security">security</category>
      <category domain="https://community.devexpress.com/Tags/TreeList">TreeList</category>
      <category domain="https://community.devexpress.com/Tags/Validation">Validation</category>
      <category domain="https://community.devexpress.com/Tags/WinForms">WinForms</category>
      <category domain="https://community.devexpress.com/Tags/workflow">workflow</category>
      <category domain="https://community.devexpress.com/Tags/XAF">XAF</category>
      <category domain="https://community.devexpress.com/Tags/XPO">XPO</category>
      <title>XAF Blazor/WinForms UI — Case Study by DataWerkes: Field Services Management Platform (TimeWerkes)</title>
      <description>&lt;p&gt;Meet &lt;a href="https://www.datawerkes.ca/" target="_blank"&gt;DataWerkes&lt;/a&gt;&amp;nbsp;(&lt;span&gt;an independent software vendor&amp;nbsp;&lt;/span&gt;in Alberta, Canada) and &lt;span&gt;Keith Courneyea (a founder),&amp;nbsp;&lt;/span&gt;who has been using our&amp;nbsp;&lt;a href="https://www.devexpress.com/products/net/application_framework/" target="_blank" style="background-color:#ffff99;"&gt;Cross-Platform .NET App UI (XAF)&lt;/a&gt;&amp;nbsp;since 2019.&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://www.devexpress.com/aboutus/testimonials/assets/casestudies/datawerkes-logo.png" alt="DataWerkes"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;We recently &lt;a href="https://www.devexpress.com/AboutUs/Testimonials/timewerkes/" target="_blank"&gt;published a case study&lt;/a&gt; about their &lt;span&gt;flagship commercial product&lt;/span&gt; (TimeWerkes)&amp;nbsp;powered by &lt;a href="https://www.devexpress.com/products/net/application_framework/" target="_blank"&gt;XAF&lt;/a&gt; WinForms/Blazor UI as well as DevExpress&amp;nbsp;&lt;a href="https://www.devexpress.com/products/net/controls/blazor/" target="_blank"&gt;Blazor&lt;/a&gt;&amp;nbsp;/&amp;nbsp;&lt;a href="https://www.devexpress.com/products/net/controls/winforms/" target="_blank"&gt;WinForms&lt;/a&gt;&amp;nbsp;(Grid &amp;amp; Data&amp;nbsp;Editors, Charts, Pivot Grid, TreeList, Scheduler, Rich Text Editor),&amp;nbsp;&lt;a href="https://www.devexpress.com/subscriptions/reporting/" target="_blank"&gt;Reporting&lt;/a&gt;&amp;nbsp;and &lt;a href="https://www.devexpress.com/products/net/dashboard/" target="_blank"&gt;BI Dashboard&lt;/a&gt; components. &lt;/p&gt;&lt;p&gt;Here is how Keith Courneyea described their product TimeWerkes (has been in active client use since late 2024):&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;TimeWerkes is a commercial, end-to-end field services management platform for industrial contractors. It manages the full business lifecycle of a contracting operation — from initial quoting through job execution, field ticketing (aka time reporting), inspection reporting, and final invoicing — within a single integrated application available as both a Windows desktop client and a Blazor Server web application. Currently the Blazor app in the primary client.&lt;br&gt;&lt;br&gt;The platform is architected as a core business foundation with industry-specific modules that can be added as client requirements evolve. The core handles workflows common to all contractors: quotes, jobs, field tickets (aka timesheets) with labour and billable items, rate sheets, approval workflows, staff and certification management, equipment tracking, document management, and full invoicing. Specialized modules adapt this base for specific industries.&lt;br&gt;&lt;br&gt; TimeWerkes is offered commercially. It is built on Microsoft SQL Server with Azure SQL in production and uses Azure Blob Storage for all document/image attachments, Azure Functions for background workflow processing, and Azure Communication Services for automated email notifications.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;img src="https://www.devexpress.com/AboutUs/Testimonials/timewerkes/i/03-job-detail-view@2x.png" alt=""&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://www.devexpress.com/AboutUs/Testimonials/timewerkes/i/05-corrosion-survey-report@2x.png" alt=""&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;DataWerkes has been in operation for seven years.&amp;nbsp;&lt;/span&gt;Keith&amp;#39;s decision to build on DevExpress in 2019 was not the result of a product evaluation or a recommendation — it was a return. He had worked with DevExpress components in the early 2000s and had a positive experience that stayed with him. When he decided to pursue serious application development, DevExpress was the first place he went back to.&lt;/p&gt;&lt;p&gt;&lt;span&gt;The specific choice of &lt;a href="https://www.devexpress.com/products/net/application_framework/" target="_blank"&gt;XAF&lt;/a&gt; as the framework was driven by what Keith needed as a first-time C# developer with a clear vision of what he wanted to build. XAF&amp;#39;s model-driven approach — where defining a domain class in XPO produces a working UI, security system, and data layer without writing boilerplate infrastructure code — meant that Keith could focus on the business logic he understood deeply and let the framework handle the rest.&lt;/span&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;And here’s what&amp;nbsp;Keith Courneyea&amp;nbsp;said about XAF&amp;#39;s primary benefits&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;TimeWerkes uses the full breadth of the XAF module ecosystem. The &lt;a href="https://docs.devexpress.com/eXpressAppFramework/113366/data-security-and-safety/security-system" target="_blank"&gt;Security System&lt;/a&gt; provides role-based access control across the entire application without custom authentication code. The &lt;a href="https://docs.devexpress.com/eXpressAppFramework/112782/data-security-and-safety/audit-trail-module-overview" target="_blank"&gt;Audit Trail&lt;/a&gt; module — extended through Llamachant&amp;#39;s enhanced implementation — tracks every change across all 120 domain entities. The &lt;a href="https://docs.devexpress.com/eXpressAppFramework/113008/validation/validation-rules" target="_blank"&gt;Validation&lt;/a&gt; module enforces business rules declaratively. &lt;a href="https://docs.devexpress.com/eXpressAppFramework/113286/conditional-appearance" target="_blank"&gt;Conditional Appearance&lt;/a&gt; drives dynamic UI behaviour. The &lt;a href="https://docs.devexpress.com/eXpressAppFramework/112811/event-planning-and-notifications/scheduler-module" target="_blank"&gt;Scheduler&lt;/a&gt; handles staff and job scheduling. &lt;a href="https://docs.devexpress.com/eXpressAppFramework/113591/shape-export-print-data/reports/reports-v2-module-overview" target="_blank"&gt;Reports Module&lt;/a&gt; V2 powers 34 reports covering every business document in the system, from client-facing inspection reports to internal job cost summaries and invoices.&lt;br&gt;&lt;br&gt;Critically, XAF&amp;#39;s cross-platform architecture meant that the same core module and XPO domain model powers three deployment targets simultaneously: a WinForms desktop client, a Blazor Server web application, and an Azure Functions background processing host. A team of any size would find that a significant time saving. For a product owned by one person and built in partnership with a small development firm, it is what made the product possible at all.&lt;br&gt;&lt;br&gt;Dave Hesketh of Llamachant Technology Ltd., whose team serves as the primary development partner on TimeWerkes, describes the XAF ecosystem as central to how Llamachant approaches every engagement. &lt;a href="https://www.llamachant.com/docs/Modules" target="_blank"&gt;Llamachant&amp;#39;s own framework extensions&lt;/a&gt; — including the workflow engine, Azure Blob file attachment integration, AutoIncrementingID, and LlamaLogger — are themselves built on top of XAF, which is a measure of how extensible and production-ready the platform is.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://www.devexpress.com/AboutUs/Testimonials/timewerkes/" target="_blank" style="background-color:#ffff99;"&gt;Read the full article&lt;/a&gt;&amp;nbsp;to learn why DataWerkes chose XAF&amp;nbsp;for&amp;nbsp;cross-platform RAD project development and&amp;nbsp;what they liked about our tools.&amp;nbsp;&lt;/p&gt;&lt;div class="Note"&gt;&lt;a href="https://docs.devexpress.com/eXpressAppFramework/113577/getting-started" style="background-color:#ffff99;"&gt;Get&amp;nbsp;Started with XAF today&lt;/a&gt;&amp;nbsp;if you want to build Office-like line-of-business (LOB) apps powered by Blazor and WinForms much faster than using traditional approaches. Check out XAF&amp;#39;s demos in your DevExpress installation or online at&amp;nbsp;&lt;a href="https://demos.devexpress.com/xaf/blazordemo/" target="_blank"&gt;https://demos.devexpress.com/xaf/blazordemo/&lt;/a&gt;. You can learn more about&amp;nbsp;&lt;a href="https://www.devexpress.com/products/net/application_framework/" target="_blank"&gt;XAF benefits here&lt;/a&gt;,&amp;nbsp;and our &lt;a href="https://www.devexpress.com/products/net/application_framework/xaf-considerations-for-newcomers.xml" target="_blank"&gt;Considerations for Newcomers&lt;/a&gt;&amp;nbsp;will help you understand whether this application framework is right for your business.&lt;br&gt;&lt;/div&gt;&lt;h2&gt;Do You Have a Story to Share?&lt;/h2&gt;&lt;p&gt;We&amp;#39;d love to publish your story on our website. It doesn’t matter if the project is big or small, or which DevExpress tools you used. Fill out this simple&amp;nbsp;&lt;a href="https://community.devexpress.com/blogs/xaf/social/Developer_Express_General_Case_Study_Template.docx" target="_blank"&gt;case&amp;nbsp;study form&lt;/a&gt;&amp;nbsp;and email us at&amp;nbsp;&lt;a href="mailto:clientservices@devexpress.com"&gt;clientservices@devexpress.com&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Thanks,&lt;br&gt;Dennis Garavsky&lt;br&gt;Principal Product Manager&lt;br&gt;&lt;a title="Email me if you have questions or suggestions" href="mailto:dennis@devexpress.com?subject=Feedback%20on%20Installation-NuGet%20Experience"&gt;dennis@devexpress.com&lt;/a&gt;&amp;nbsp;&lt;/p&gt;</description>
      <pubDate>Mon, 01 Jun 2026 12:49:00 Z</pubDate>
      <dc:creator>Dennis Garavsky (DevExpress)</dc:creator>
    </item>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:388290</guid>
      <link>https://community.devexpress.com/Blogs/news/archive/2026/05/29/application-security-documents-are-untrusted-input.aspx</link>
      <category domain="https://community.devexpress.com/Tags/.NET">.NET</category>
      <category domain="https://community.devexpress.com/Tags/.net+core">.net core</category>
      <category domain="https://community.devexpress.com/Tags/Architecture">Architecture</category>
      <category domain="https://community.devexpress.com/Tags/ASP.NET">ASP.NET</category>
      <category domain="https://community.devexpress.com/Tags/Blazor">Blazor</category>
      <category domain="https://community.devexpress.com/Tags/Office+File+API">Office File API</category>
      <category domain="https://community.devexpress.com/Tags/Reporting">Reporting</category>
      <category domain="https://community.devexpress.com/Tags/security">security</category>
      <category domain="https://community.devexpress.com/Tags/WinForms">WinForms</category>
      <category domain="https://community.devexpress.com/Tags/WPF">WPF</category>
      <category domain="https://community.devexpress.com/Tags/XAF">XAF</category>
      <title>Application Security — Documents Are Untrusted Input</title>
      <description>&lt;h2 id="a-docx-is-a-zip-file"&gt;A .docx is a ZIP file&lt;/h2&gt;
&lt;p&gt;Open a &lt;code&gt;.docx&lt;/code&gt; file in a hex editor and the first two bytes are &lt;code&gt;PK&lt;/code&gt;. Every
modern Office format - &lt;code&gt;.docx&lt;/code&gt;, &lt;code&gt;.xlsx&lt;/code&gt;, &lt;code&gt;.pptx&lt;/code&gt; - is a ZIP archive of XML parts
and embedded resources. PDF is not a ZIP file, but just like Office formats it
is a container. When your code loads any of these file types, some complex work
is done with the content of that container: compressed streams are inflated,
references are resolved, an object graph is materialized.&lt;/p&gt;
&lt;p&gt;Most of us understand a “load document” feature to be a passive read operation:
bytes in, document model out, nothing happens that we didn’t ask for. But
loading is not passive, and the document itself dictates the shape and size of
the process. A document can instruct the loader to allocate gigabytes from a few
kilobytes on disk, to follow a path that climbs out of the extraction directory,
or to decrypt with primitives pulled in by the format specification
implicitly. The document is input, but it must be treated as untrusted input.&lt;/p&gt;
&lt;p&gt;Loading a document implies a security boundary.&lt;/p&gt;
&lt;p&gt;Here are a few examples of known attack vectors used “in the wild” against document loaders:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Decompression bombs” are small archives that inflate to a size which exhausts memory.&lt;/li&gt;
&lt;li&gt;Path traversal (“Zip Slip”) can write outside the intended directory when
extracted carelessly, by using an entry named &lt;code&gt;../../etc/something&lt;/code&gt; or &lt;code&gt;..\..\Windows\System32\something&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Symlink and device-name tricks use entries resolving to absolute paths, or to
reserved Windows names like &lt;code&gt;CON&lt;/code&gt;, &lt;code&gt;NUL&lt;/code&gt;, &lt;code&gt;PRN&lt;/code&gt;, to cause damage when extracted.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="compatible-is-not-secure"&gt;”Compatible” is not “secure”&lt;/h2&gt;
&lt;p&gt;Most applications which load documents can’t easily decide to only support the
latest formats. Of course we know not to assume that old formats are as secure
as new ones, but since support for legacy formats is required, we may believe
that if our loader algorithms are compliant with the latest standards, then we
are secure. Unfortunately, that is not always the case.&lt;/p&gt;
&lt;p&gt;For example, a PDF may be encrypted with AES-128. By name that is a modern
choice, nothing obviously legacy about it. But the PDF standard (ISO 32000-1)
requires AES-128-encrypted PDFs to derive the encryption key with MD5 and to
validate permissions with RC4. Both are long recognized as cryptographically
weak, and neither is permitted under FIPS 140-2, the US government’s
cryptographic standard. PDF readers that support AES-128 encryption need to
support MD5 and RC4, and this means that the code path that loads such documents
is not FIPS-compliant.&lt;/p&gt;
&lt;p&gt;This is what “compatible isn’t secure” actually means: you didn’t knowingly pick
something old, but your choice to support a seemingly current format carries a
hidden legacy dependency. The same is true of Office document protection: the
latest OpenXML formats support SHA-512 hashing, but they also support SHA-1 and
MD5 for legacy reasons. If you support the format, you support the legacy
algorithms too.&lt;/p&gt;
&lt;p&gt;A document format is a specification, and it can mandate approaches that your
application code can’t avoid. Your exposure is inherited from the standards you
choose to support, not introduced by any mistakes you made.&lt;/p&gt;
&lt;p&gt;In the .NET space in particular, the Windows FIPS policy used to be the main
line of defence against this problem. If you tried to load a document that
triggered a non-compliant code path, the runtime would throw an
exception. However, this safety mechanism was never perfect:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On .NET Framework with the Windows FIPS policy enabled, instantiating a
non-validated algorithm threw an exception. However, that exception was a
&lt;code&gt;TargetInvocationException&lt;/code&gt; with a message pointing at a generic non-validated
implementation, and lacking details like the document type or the offending
algorithm.&lt;/li&gt;
&lt;li&gt;On .NET 5 and later, managed FIPS enforcement was largely removed. An MD5/RC4
code path now runs with no error at all. The trap is the transition: code that
threw reliably on .NET Framework can fall silent after a routine upgrade to
.NET 5 or later, with no source change. It is easy to read that silence as the
problem having been fixed, when in fact only the diagnostic has gone, while
the code remains exactly as non -compliant, just quieter about it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This means that any loader code is responsible for auditing the document types
it supports. We can’t rely on the runtime to enforce compliance.&lt;/p&gt;
&lt;h2 id="office-file-api-compliance-and-safety-by-design"&gt;Office &amp;amp; PDF File API: compliance and safety by design&lt;/h2&gt;
&lt;p&gt;The latest &lt;a href="https://www.devexpress.com/products/net/office-file-api/" target="_blank" style="background-color:#ffffff;"&gt;Office &amp;amp; PDF File API&lt;/a&gt; answers both halves of the problem with a single
idea: &lt;strong&gt;compliance and structural safety should be enforced automatically and
early in the pipeline&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;At the cryptographic layer, FIPS enforcement is now explicit. On a FIPS-enforced
Windows system, opening or saving a document that depends on cryptography
prohibited by FIPS (this includes encrypted XLS or DOC files, AES-128 or ARC4
PDFs, OpenXML protection using SHA-1 or MD5 hashes) throws a
&lt;code&gt;DevExpress.Utils.OperatingSystemLevelFipsMode.ComplianceViolationException&lt;/code&gt;
&lt;em&gt;before&lt;/em&gt; processing. We made two design choices to improve upon the .NET
Framework-style handling. First,
the exception derives from &lt;code&gt;System.Security.SecurityException&lt;/code&gt;, so existing
&lt;code&gt;catch (SecurityException)&lt;/code&gt; blocks keep working unchanged. Second, the message
includes actionable details: instead of the runtime’s generic string, our
message tells you which detail of the document you attempted to load was
non-compliant, and we include suggestions for compliance.&lt;/p&gt;
&lt;p&gt;Note that on machines which are not configured with the Windows FIPS policy, or
in non-Windows environments, no cryptography validation is performed. It is
possible to force the same behavior by setting
&lt;code&gt;DevExpress.Utils.OperatingSystemLevelFipsMode.ForcedFipsMode&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt;, and
you can use &lt;code&gt;IsEnabled&lt;/code&gt; on the same type to detect whether the policy is
active. Setting &lt;code&gt;ForcedFipsMode&lt;/code&gt; does not change the operating system level
policy.&lt;/p&gt;
&lt;p&gt;At the structural layer, the new &lt;code&gt;SecureZipPolicy&lt;/code&gt; applies to both the low-level
data engine (&lt;code&gt;DevExpress.Utils.Zip&lt;/code&gt;) and the high-level API
(&lt;code&gt;DevExpress.Compression.ZipArchive&lt;/code&gt;). It enforces resource limits with sensible
defaults, such as maximum entry count, per-entry and total uncompressed size,
per-entry and total compression ratio to guard against “decompression bombs”, as
well as path-nesting depth. It blocks the structural attacks mentioned earlier:
path traversal, absolute paths, control characters, reserved device names,
symlinks. The write-time encryption default also changes from the old
&lt;code&gt;EncryptionType.PkZip&lt;/code&gt; to AES-256.&lt;/p&gt;
&lt;p&gt;The structural enforcement through &lt;code&gt;SecureZipPolicy&lt;/code&gt; applies to all ZIP
processing and is not tied to the FIPS policy. But on systems that do not have
FIPS enabled, a call to &lt;code&gt;SecureZipPolicy.SetEncryptionPolicy(...)&lt;/code&gt; with either
&lt;code&gt;AesRequired&lt;/code&gt; or &lt;code&gt;FipsStrict&lt;/code&gt; (the latter disallows any unknown encryption types
on read) enables the encryption policies regardless of any OS-level
configuration.&lt;/p&gt;
&lt;h2 id="some-of-these-changes-may-be-breaking"&gt;Some of these changes may be “breaking”&lt;/h2&gt;
&lt;p&gt;If you process documents on FIPS-enforced systems, code that previously ran on
.NET 5 or later may now throw an exception. We have published detailed guidance
for existing code, &lt;a href="https://supportcenter.devexpress.com/ticket/details/t1327031/office-pdf-file-api-fips-enforcement-for-encrypted-doc-xls-and-pdf-documents" rel="nofollow noreferrer" target="_blank"&gt;Breaking Change T1327031 for the Office and PDF File
API&lt;/a&gt;
and &lt;a href="https://supportcenter.devexpress.com/ticket/details/t1325920/new-zip-security-policy-has-been-applied-to-both-our-low-level-data-engine-devexpress" rel="nofollow noreferrer" target="_blank"&gt;Breaking Change T1325920 for the new Zip Security
Policy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It is important to point out that these changes are only “breaking” in the sense
that they change behavior for existing implementations. They make your code
safer (very directly so in the case of the new Zip security policy), and offer
improved discoverability and auditability of violations for FIPS compliance.&lt;/p&gt;
&lt;p&gt;Without repeating the details of the guides, it is possible to adjust some of
the defaults to restore old behavior, but also to accommodate your
requirements. For example, the Zip policy has tunable parameters for resource
protection.&lt;/p&gt;
&lt;p&gt;We recommend that you take the opportunity to review your document processing
code and consider whether you can migrate to more secure formats. You can use
the new observable violations to identify documents that are currently being
processed but would not be compliant with the new policies, and then make
informed decisions.&lt;/p&gt;&lt;p&gt;&lt;span&gt;See also:&amp;nbsp;&lt;/span&gt;&lt;a href="https://community.devexpress.com/Blogs/news/archive/2026/04/17/application-security-stronger-hashes-and-safer-passwords.aspx"&gt;Application Security — Stronger Hashes and Safer Passwords&lt;/a&gt;&lt;span&gt;.&lt;/span&gt;&lt;br&gt;&lt;/p&gt;
&lt;h2 id="compatibility-and-security"&gt;Compatibility and security&lt;/h2&gt;
&lt;p&gt;A common perception is that security and compatibility are always in tension. We
should state up front that this is not generally true. The new &lt;a href="https://www.devexpress.com/products/net/office-file-api/" target="_blank"&gt;Office &amp;amp; PDF File API&lt;/a&gt;
is an example of a case where the compliant choice and the convenient choice are
the same, and the new enforcement simply makes that alignment visible. For many
applications, there is no meaningful trade-off between security and
compatibility.&lt;/p&gt;
&lt;p&gt;The real conflict between security and compatibility is mostly at the legacy
surface area. Sticking to documents as the main topic of this article, that
legacy surface area can be large if you need to support old formats and old
storage standards, but it can be small if you can migrate to current formats.&lt;/p&gt;
&lt;p&gt;There are two recommendations for navigation of this tension.&lt;/p&gt;
&lt;p&gt;First, if you can use current formats, do. Migrating encrypted XLS to XLSX, DOC
to DOCX and AES-128/ARC4 PDFs to AES-256 (Revision 6) is an easy and cheap
path - speaking from the purely technical perspective of course, while
organizational and regulatory constraints may be more complex, and only you can
judge the practical complexity of migration in your environment.&lt;/p&gt;
&lt;p&gt;If legacy formats are genuinely unavoidable, then treat those documents
explicitly as untrusted input and wrap them accordingly: you now get resource
limits by default, and you can consider separating your loading or conversion
logic out to a standalone process that makes it possible to apply OS limits on
memory use or prevent network access - bearing in mind that any loading method
still parses the document, so the point of a separate process is to contain that
parse, not to avoid it.&lt;/p&gt;
&lt;p&gt;Depending on the exposure your project has to unverified input, you will find
your own balance of “defense in depth” measures, but it is important to make
active decisions about these assessments. Monitoring for violations is easy with
the new policies, and the &lt;code&gt;ResourceLimitViolation&lt;/code&gt; and &lt;code&gt;TrustBoundaryViolation&lt;/code&gt;
events exist precisely so that you gain auditability that matters particularly
in regulated, enterprise, and government environments.&lt;/p&gt;

&lt;h2&gt;Your Feedback Matters!&lt;/h2&gt;
&lt;div data-survey-id="b31c0c9e-b420-4b2b-9501-2a16d14dd7af" data-survey-auth-required="false"&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 29 May 2026 07:04:00 Z</pubDate>
      <dc:creator>Oliver Sturm (DevExpress)</dc:creator>
    </item>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:388289</guid>
      <link>https://community.devexpress.com/Blogs/aspnet/archive/2026/05/22/devexpress-blazor-ai-chat-multi-model-support-mcp-server-integration-and-a-look-at-what-39-s-coming-next.aspx</link>
      <category domain="https://community.devexpress.com/Tags/AI">AI</category>
      <category domain="https://community.devexpress.com/Tags/Blazor">Blazor</category>
      <category domain="https://community.devexpress.com/Tags/Chat+UI">Chat UI</category>
      <category domain="https://community.devexpress.com/Tags/LLM">LLM</category>
      <category domain="https://community.devexpress.com/Tags/MCP">MCP</category>
      <category domain="https://community.devexpress.com/Tags/v26.1">v26.1</category>
      <title>DevExpress Blazor AI Chat — Multi-Model Support, MCP Server Integration, and a Look at What's Coming Next</title>
      <description>&lt;p&gt;We continue to extend the capabilities of the&amp;nbsp;&lt;a href="https://docs.devexpress.com/Blazor/DevExpress.AIIntegration.Blazor.Chat.DxAIChat" target="_blank" title="DevExpress Blazor AI Chat"&gt;DevExpress Blazor AI Chat&lt;/a&gt; component and publish GitHub examples designed to address real-world usage scenarios. This post highlights two new examples: a multi-model chat with persistent conversation history, and MCP server integration that extends AI context with external data sources. I&amp;#39;ll also share planned features for v26.1 (scheduled for mid-June 2026).&lt;/p&gt;

&lt;h2 id="multi-model-chat-with-conversation-history"&gt;Multi-Model Chat with Conversation History&lt;/h2&gt;

&lt;p&gt;Our &lt;a href="https://community.devexpress.com/Blogs/aspnet/archive/2025/05/06/devexpress-blazor-ai-chat-build-a-multi-llm-chat-application.aspx" target="_blank" title="DevExpress Blazor AI Chat — Build a Multi-LLM Chat Application"&gt;earlier multi-LLM chat application example&lt;/a&gt; demonstrated how to switch between AI providers within a single chat session. The new &lt;a href="https://github.com/DevExpress-Examples/blazor-ai-chat-with-multiple-llm-services" target="_blank" title="DevExpress Blazor AI Chat — Multi-Model Chat with Conversation History"&gt;DevExpress Blazor AI Chat — Multi-Model Chat with Conversation History&lt;/a&gt; example adds persistent conversation threads and automated chat session title generation.&lt;/p&gt;

&lt;img class="small" src="https://community.devexpress.com/blogs/aspnet/26.1/mcp-multi-llm/devexpress-ai-blazor-chat-multi-llm-with-title-generation.png" alt="The multi-model chat UI showing the left sidebar with a list of conversation threads (each with an auto-generated title), a model selector dropdown at the top, and the active chat pane on the right." style="width:730px;height:606px;"&gt;

&lt;p&gt;The application uses a two-pane layout with &lt;code&gt;DxSplitter&lt;/code&gt;. The left pane is a sidebar that hosts a &lt;code&gt;DxComboBox&lt;/code&gt; for model selection and a &lt;code&gt;DxListBox&lt;/code&gt; for conversation threads. &lt;code&gt;InMemoryChatThreadStore&lt;/code&gt; manages thread data. This thread-safe dictionary-backed store tracks message history and timestamps. The right pane hosts the &lt;code&gt;DxAIChat&lt;/code&gt; component. The following Razor markup defines the layout:&lt;/p&gt;

&lt;pre&gt;&lt;code class="language-html"&gt;&amp;lt;DxSplitter CssClass=&amp;quot;chat-splitter&amp;quot; Height=&amp;quot;100%&amp;quot;&amp;gt;
    &amp;lt;Panes&amp;gt;
        &amp;lt;DxSplitterPane Size=&amp;quot;320px&amp;quot; MinSize=&amp;quot;220px&amp;quot; MaxSize=&amp;quot;500px&amp;quot;&amp;gt;
            &amp;lt;DxButton RenderStyle=&amp;quot;ButtonRenderStyle.Primary&amp;quot;
                      RenderStyleMode=&amp;quot;ButtonRenderStyleMode.Contained&amp;quot;
                      Text=&amp;quot;New Chat&amp;quot;
                      Click=&amp;quot;CreateNewThreadAsync&amp;quot; /&amp;gt;
            &amp;lt;DxComboBox Data=&amp;quot;@ModelsList&amp;quot;
                        Value=&amp;quot;@SelectedModel&amp;quot;
                        TextFieldName=&amp;quot;@nameof(ChatClientSession.Name)&amp;quot;
                        ValueChanged=&amp;quot;@((ChatClientSession session) =&amp;gt; OnSelectedThreadModelChangedAsync(session))&amp;quot; /&amp;gt;
            &amp;lt;DxListBox Data=&amp;quot;@Threads&amp;quot;
                       Value=&amp;quot;@SelectedThread&amp;quot;
                       ValueChanged=&amp;quot;@((ChatThread thread) =&amp;gt; OnThreadSelectedAsync(thread))&amp;quot;
                       TextFieldName=&amp;quot;@nameof(ChatThread.Title)&amp;quot;&amp;gt;
                &amp;lt;ItemDisplayTemplate&amp;gt;
                    &amp;lt;div class=&amp;quot;thread-list-item&amp;quot;&amp;gt;
                        &amp;lt;div class=&amp;quot;thread-title&amp;quot;&amp;gt;@context.DataItem.Title&amp;lt;/div&amp;gt;
                        &amp;lt;div class=&amp;quot;thread-model&amp;quot;&amp;gt;@GetModelName(context.DataItem.ModelSessionId)&amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/ItemDisplayTemplate&amp;gt;
            &amp;lt;/DxListBox&amp;gt;
        &amp;lt;/DxSplitterPane&amp;gt;
        &amp;lt;DxSplitterPane&amp;gt;
            &amp;lt;DxAIChat @ref=&amp;quot;DxAiChat&amp;quot;
                      Initialized=&amp;quot;OnChatInitialized&amp;quot; /&amp;gt;
        &amp;lt;/DxSplitterPane&amp;gt;
    &amp;lt;/Panes&amp;gt;
&amp;lt;/DxSplitter&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Automatic thread title generation is a key implementation detail. The &lt;code&gt;CompositeChatClient&lt;/code&gt; class implements &lt;code&gt;IChatClient&lt;/code&gt; and intercepts outgoing user messages via &lt;code&gt;GetResponseAsync&lt;/code&gt; and &lt;code&gt;GetStreamingResponseAsync&lt;/code&gt; methods. On the first message in a new thread, the class sends a background request to the selected AI model using a dedicated system prompt and requests a concise 3–6 word title. &lt;code&gt;IChatThreadStore&lt;/code&gt; stores the result. The &lt;code&gt;ThreadTitleUpdated&lt;/code&gt; event updates the UI and refreshes the sidebar without blocking the main chat response:&lt;/p&gt;

&lt;pre&gt;&lt;code class="language-csharp"&gt;// CompositeChatClient.cs
public IAsyncEnumerable&amp;lt;ChatResponseUpdate&amp;gt; GetStreamingResponseAsync(IEnumerable&amp;lt;ChatMessagegt; messages, 
ChatOptions? options = null, CancellationToken cancellationToken = new CancellationToken())
    {
        var selectedSession = GetRequiredSelectedSession();
        var messageList = messages.ToList();
        TryQueueTitleGeneration(messageList, selectedSession);
		...
        await foreach (var update in selectedSession.Client.GetStreamingResponseAsync(
        	messageList, options, cancellationToken))
            yield return update;
        ...
    }

private void TryQueueTitleGeneration(IEnumerable&amp;lt;ChatMessage&amp;gt; messages, ChatClientSession selectedSession) {
    var threadId = _activeThreadId.Value;
    var firstUserMessage = GetFirstUserMessage(messages);
    ...
    _ = GenerateTitleForThreadAsync(threadId, selectedSession, firstUserMessage);
}

private async Task GenerateTitleForThreadAsync(Guid threadId,
    ChatClientSession selectedSession, string firstUserMessage) {
    try {
        var thread = await _threadStore.GetThreadAsync(threadId, CancellationToken.None);
        if (thread is null || thread.HasGeneratedTitle)
            return;

        var modelSession = AvailableChatClients
            .FirstOrDefault(x =&amp;gt; x.Id == thread.ModelSessionId) ?? selectedSession;

        string generatedTitle;
            try {
                generatedTitle = await _titleGenerator.GenerateTitleAsync(modelSession, firstUserMessage, CancellationToken.None);
            }
            catch {
                generatedTitle = _titleGenerator.BuildFallbackTitle(firstUserMessage);
            }

            if (string.IsNullOrWhiteSpace(generatedTitle)) {
                generatedTitle = _titleGenerator.BuildFallbackTitle(firstUserMessage);
            }

            await _threadStore.UpdateTitleAsync(threadId, generatedTitle, true, CancellationToken.None);
            lock (_syncRoot) {
                _titledThreadIds.Add(threadId);
            }
            ThreadTitleUpdated?.Invoke(threadId, generatedTitle);
        }
        catch (OperationCanceledException) { }
        finally {
            lock (_syncRoot)
                _titleGenerationInProgress.Remove(threadId);
        }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The example includes an in-memory store. The &lt;code&gt;IChatThreadStore&lt;/code&gt; interface allows for replacement with an EF Core-backed implementation for applications that require persistent history.&lt;/p&gt;

&lt;p&gt;To download and explore our implementation, navigate to the following&amp;nbsp;DevExpress GitHub repository: &lt;a href="https://github.com/DevExpress-Examples/blazor-ai-chat-with-multiple-llm-services" target="_blank" title="Blazor AI Chat — Multi-Model Chat with Conversation History"&gt;Blazor AI Chat — Multi-Model Chat with Conversation History&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="mcp-server-integration"&gt;MCP Server Integration&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/DevExpress-Examples/blazor-ai-chat-mcp-resources" target="_blank" title="DevExpress Blazor AI Chat — Integration with Model Context Protocol"&gt;DevExpress Blazor AI Chat — Integration with Model Context Protocol&lt;/a&gt; example connects our Blazor AI Chat component to external data through the &lt;a href="https://modelcontextprotocol.io/docs/getting-started/intro" target="_blank" title="Model Context Protocol — Introduction"&gt;Model Context Protocol (MCP)&lt;/a&gt;.&lt;/p&gt;

&lt;img class="small" src="https://community.devexpress.com/blogs/aspnet/26.1/mcp-multi-llm/devexpress-ai-blazor-chat-mcp-resources-window.png" alt="The Blazor AI Chat UI with an MCP-powered chat session open, showing the chat querying a server access log and receiving an AI-generated analysis in response." style="width:626px;height:602px;"&gt;

&lt;p&gt;The solution includes two projects.&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;code&gt;AIChatMcpServer&lt;/code&gt; is a custom MCP server that exposes sample tools, resources, and prompt templates to the client application.&lt;/li&gt;
    &lt;li&gt;&lt;code&gt;AIChatMcpClient&lt;/code&gt; is a Blazor Server application that hosts &lt;code&gt;DxAIChat&lt;/code&gt; and loads MCP capabilities at startup through a hosted &lt;code&gt;McpRepository&lt;/code&gt; service.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The sample MCP server exposes three primitives: &lt;strong&gt;tools&lt;/strong&gt; (executable functions the AI model can call automatically), &lt;strong&gt;resources&lt;/strong&gt; (static content such as logs, text files, and binary images), and &lt;strong&gt;prompts&lt;/strong&gt; (reusable parameterized templates). &lt;code&gt;McpRepository&lt;/code&gt; loads these primitives at startup and passes them to &lt;code&gt;DxAIChat&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Each primitive maps directly to a &lt;code&gt;DxAIChat&lt;/code&gt; feature. Resources map to &lt;code&gt;AIChatResource&lt;/code&gt; objects and populate the &lt;code&gt;Resources&lt;/code&gt; collection. Prompts map to &lt;code&gt;DxAIChatPromptSuggestion&lt;/code&gt; entries displayed when the chat opens. Tools attach to &lt;code&gt;IChatClient&lt;/code&gt; through &lt;code&gt;UseFunctionInvocation&lt;/code&gt; at startup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Index.razor&lt;/strong&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code class="language-html"&gt;&amp;lt;DxAIChat FileUploadEnabled=&amp;quot;true&amp;quot;
          Resources=&amp;quot;Resources&amp;quot;
          IncludeFunctionCallInfo=&amp;quot;true&amp;quot;&amp;gt;
        &amp;lt;PromptSuggestions&amp;gt;
            @foreach (var suggestion in PromptSuggestions){
                &amp;lt;DxAIChatPromptSuggestion PromptMessage=&amp;quot;@suggestion.PromptMessage&amp;quot; Title=&amp;quot;@suggestion.Title&amp;quot; Text=&amp;quot;@suggestion.PromptMessage&amp;quot;/&amp;gt;
            }
        &amp;lt;/PromptSuggestions&amp;gt;
        &amp;lt;AIChatSettings&amp;gt;
            &amp;lt;DxAIChatFileUploadSettings MaxFileSize=&amp;quot;10000000&amp;quot; MaxFileCount=&amp;quot;3&amp;quot;/&amp;gt;
        &amp;lt;/AIChatSettings&amp;gt;
    &amp;lt;/DxAIChat&amp;gt;

@code {
    IEnumerable&amp;lt;AIChatResource&amp;gt; Resources { get; set; } = [];
    IEnumerable&amp;lt;PromptSuggestion&amp;gt; PromptSuggestions { get; set; } = [];

    protected override async Task OnInitializedAsync() {
        // Map MCP resources to AIChatResource — DxAIChat fetches content on demand via LoadResourceData
        Resources = McpRepository.Resources.Select(x =&amp;gt;
            new AIChatResource(x.Uri, x.Name, LoadResourceData, x.MimeType, x.Description));
        // Map MCP prompt templates to prompt suggestions shown in the chat UI
        PromptSuggestions = McpRepository.PromptSuggestions;
    }

    async Task&amp;lt;IList&amp;lt;AIContent&amp;gt;&amp;gt; LoadResourceData(AIChatResource resource, CancellationToken ct) {
        var result = await McpRepository.Client.ReadResourceAsync(resource.Uri, cancellationToken: ct);
        return result.Contents.ToAIContents();
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Program.cs&lt;/strong&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code class="language-csharp"&gt;using Azure;
using Azure.AI.OpenAI;
using AIChatMcpClient;
using AIChatMcpClient.Components;
using AIChatMcpClient.Services;
using Microsoft.Extensions.AI;
...

builder.Services.AddSingleton&amp;lt;McpRepository&amp;gt;();
builder.Services.AddHostedService(sp =&amp;gt; sp.GetRequiredService&amp;lt;McpRepository&amp;gt;());

builder.Services.AddSingleton&amp;lt;IChatClient&amp;gt;(sp =&amp;gt; {
    var mcpRepository = sp.GetService&amp;lt;McpRepository&amp;gt;();
    var azureOpenAIClient = new AzureOpenAIClient(
        new Uri(azureOpenAISettings.Endpoint),
        new AzureKeyCredential(azureOpenAISettings.ApiKey));
    var chatClient = azureOpenAIClient.GetChatClient(azureOpenAISettings.DeploymentName).AsIChatClient();
    return new ChatClientBuilder(chatClient)
        .ConfigureOptions(co =&amp;gt; {
            co.Tools = mcpRepository.Tools.ToArray&amp;lt;AITool&amp;gt;();
        })
        .UseFunctionInvocation()
        .Build();
});
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The implementation follows MCP standards. Client code requires no changes when you switch to another MCP-compliant backend. To connect the Blazor application to a different MCP server, modify the &lt;code&gt;McpRepository&lt;/code&gt; endpoint:&lt;/p&gt;

&lt;pre&gt;&lt;code class="language-csharp"&gt;using AIChatMcpClient.Models;
using ModelContextProtocol.Client;
using ModelContextProtocol.Protocol;
...
public class McpRepository : IHostedService, IAsyncDisposable {
    private readonly string _mcpEndpoint;

    public McpClient Client { get; private set; } = null!;
    public List&amp;lt;McpClientTool&amp;gt; Tools { get; } = [];
    public List&amp;lt;McpClientResource&amp;gt; Resources { get; } = [];
    public List&amp;lt;McpClientPrompt&amp;gt; Prompts { get; } = [];
    public List&amp;lt;PromptSuggestion&amp;gt; PromptSuggestions { get; } = [];

    public McpRepository(IConfiguration configuration) {
        _mcpEndpoint = configuration.GetSection(&amp;quot;McpServer:Endpoint&amp;quot;).Value 
                       ?? throw new InvalidOperationException(&amp;quot;McpServer:Endpoint is not configured in appsettings.json&amp;quot;);
    }

    public async Task StartAsync(CancellationToken cancellationToken) {
        var transport = new HttpClientTransport(new() { Endpoint = new(_mcpEndpoint) });
        Client = await McpClient.CreateAsync(transport);
        
        var tools = await Client.ListToolsAsync(cancellationToken: cancellationToken);
        var resources = await Client.ListResourcesAsync(cancellationToken: cancellationToken);
        var prompts = await Client.ListPromptsAsync(cancellationToken: cancellationToken);
        
        Tools.AddRange(tools);
        Resources.AddRange(resources);
        Prompts.AddRange(prompts);

        // Preload prompt suggestions at startup
        foreach (var prompt in Prompts) {
            var result = await prompt.GetAsync();
            var content = result.Messages[0].Content;
            PromptSuggestions.Add(new PromptSuggestion {
                PromptMessage = ((TextContentBlock)content).Text,
                Title = prompt.Title ?? &amp;quot;Untitled&amp;quot;
            });
        }
    }

    public Task StopAsync(CancellationToken cancellationToken) =&amp;gt; Task.CompletedTask;

    public async ValueTask DisposeAsync() {
        await Client.DisposeAsync();
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;span&gt;To download and explore our implementation, navigate to the following&amp;nbsp;DevExpress GitHub repository&lt;/span&gt;: &lt;a href="https://github.com/DevExpress-Examples/blazor-ai-chat-mcp-resources" target="_blank" title="DevExpress Blazor AI Chat — Integration with Model Context Protocol"&gt;DevExpress Blazor AI Chat — Integration with Model Context Protocol&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="whats-coming-in-v26-1"&gt;What&amp;#39;s Coming in v26.1&lt;/h2&gt;

&lt;p&gt;Our v26.1 release is scheduled for mid-June 2026 and includes the following enhancements to DevExpress AI Chat components for Blazor, WinForms, and WPF.&lt;/p&gt;

&lt;h3 id="microsoft-agent-framework-and-openai-responses-api-support"&gt;Microsoft Agent Framework and OpenAI Responses API Support&lt;/h3&gt;

&lt;p&gt;The most substantial addition is a new &lt;code&gt;IChatResponseProvider&lt;/code&gt; abstraction layer that decouples the chat UI from the underlying AI service. This layer allows you to bind &lt;code&gt;DxAIChat&lt;/code&gt; to a wider set of AI backends beyond the standard &lt;code&gt;IChatClient&lt;/code&gt; interface, including the Microsoft Agent Framework (with support for agents, executors, and multi-step workflows), the OpenAI Responses API, and Azure AI Projects. The API also supports custom &lt;code&gt;IChatResponseProvider&lt;/code&gt; implementations for usage scenarios that don&amp;#39;t fit standard providers.&lt;/p&gt;

&lt;p&gt;Planned demos will illustrate how to connect our&amp;nbsp;AI Chat Control to individual agents, composite workflows, AG-UI backends, and tool approval workflows in agentic pipelines.&lt;/p&gt;

&lt;h3 id="api-enhancements"&gt;API Enhancements&lt;/h3&gt;

&lt;p&gt;v26.1 replaces the &lt;code&gt;MessageSent&lt;/code&gt; event with &lt;code&gt;MessageSending&lt;/code&gt;. This event fires before the message is added to chat history and sent to the AI service. Additionally, this event exposes an &lt;code&gt;e.Cancel&lt;/code&gt; parameter that allows you to block send operations entirely. Use it to preprocess and validate input, filter content, call external services and handle the messaging pipeline manually. Alternatively, if &lt;code&gt;e.Cancel&lt;/code&gt; is set to &lt;code&gt;false&lt;/code&gt;, the AI Chat Control will continue sending and displaying messages and allow you to log and audit user messages without disruption to the normal message pipeline.&lt;/p&gt;

&lt;p&gt;The new event also supports augmentation before delivery — for example, appending a system message or supplemental context to the chat history via the new &lt;code&gt;AppendMessageAsync&lt;/code&gt; method:&lt;/p&gt;

&lt;pre&gt;&lt;code class="language-csharp"&gt;async void AiChatControl1_MessageSending(object sender, AIChatControlMessageSendingEventArgs e) {
    // Append a system message before sending the user&amp;#39;s prompt to the AI service.
    await e.Chat.AppendMessageAsync(&amp;quot;Translate text to Spanish&amp;quot;, ChatRole.System);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="empty-chat-customization"&gt;Empty Chat Customization&lt;/h3&gt;

&lt;p&gt;v26.1 introduces two new properties designed to customize initial chat state. &lt;code&gt;EmptyMessageAreaText&lt;/code&gt; specifies text dispalyed in the empty chat area, and &lt;code&gt;InputBoxNullText&lt;/code&gt; specifies placeholder text in the input box. These properties allow you to align the initial chat experience with application context and tone:&lt;/p&gt;

&lt;pre&gt;&lt;code class="language-html"&gt;&amp;lt;DxAIChat EmptyMessageAreaText=&amp;quot;How can I help you today?&amp;quot;
          InputBoxNullText=&amp;quot;Ask a question or describe a task...&amp;quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;img src="https://community.devexpress.com/blogs/aspnet/26.1/mcp-multi-llm/26-1-blazor-aichat-empty-chat-ui@2x.png" alt="Blazor AI Chat — Customized Empty Text Area and Input Null Text" style="width:780px;height:300px;"&gt;

&lt;h2 id="share-your-feedback"&gt;Share Your Feedback&lt;/h2&gt;

&lt;p&gt;Looking for a particular code example? &lt;a href="https://supportcenter.devexpress.com/" target="_blank" title="DevExpress Support Center"&gt;Contact us via the DevExpress Support Center&lt;/a&gt; to share your usage scenario and we&amp;#39;ll be happy to recommend an implementation.&lt;/p&gt;</description>
      <pubDate>Fri, 22 May 2026 00:01:00 Z</pubDate>
      <dc:creator>Dmitry Tokmachev (DevExpress)</dc:creator>
    </item>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:388287</guid>
      <link>https://community.devexpress.com/Blogs/news/archive/2026/05/07/sboms-for-cra-compliance-in-devexpress-based-apps-preview-now-open.aspx</link>
      <category domain="https://community.devexpress.com/Tags/.NET">.NET</category>
      <category domain="https://community.devexpress.com/Tags/.net+core">.net core</category>
      <category domain="https://community.devexpress.com/Tags/CRA">CRA</category>
      <category domain="https://community.devexpress.com/Tags/Featured">Featured</category>
      <category domain="https://community.devexpress.com/Tags/JS">JS</category>
      <category domain="https://community.devexpress.com/Tags/npm">npm</category>
      <category domain="https://community.devexpress.com/Tags/NuGet">NuGet</category>
      <category domain="https://community.devexpress.com/Tags/SBOM">SBOM</category>
      <category domain="https://community.devexpress.com/Tags/security">security</category>
      <category domain="https://community.devexpress.com/Tags/VCL">VCL</category>
      <title>SBOMs for CRA Compliance in DevExpress-Based Apps — Preview Now Open</title>
      <description>&lt;p&gt;If you ship apps to customers in the EU, the Cyber Resilience Act (CRA) will require a Software Bill of Materials&amp;nbsp;(SBOM) as part of your conformity documentation. SBOM generation and CRA compliance are top priorities for DevExpress, and CycloneDX SBOM files for our .NET NuGet packages are now available as a preview. We are looking for feedback to help us refine our solution before a broader release.&lt;/p&gt;
&lt;h2 id="why-this-matters"&gt;Why This Matters&lt;/h2&gt;
&lt;p&gt;Regulatory expectations around software supply chain transparency have moved from emerging practice to a baseline requirement over the past four years:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2021&lt;/strong&gt; — SBOM became a key requirement of the &lt;a href="https://www.whitehouse.gov/briefing-room/presidential-actions/2021/05/12/executive-order-on-improving-the-nations-cybersecurity/"&gt;US Executive Order 14028 on Improving the Nation&amp;#39;s Cybersecurity&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2022&lt;/strong&gt; — Microsoft open-sourced its &lt;a href="https://devblogs.microsoft.com/engineering-at-microsoft/microsoft-open-sources-software-bill-of-materials-sbom-generation-tool/"&gt;SBOM generation tool&lt;/a&gt;, signaling SBOM as a standard part of the build pipeline.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2024&lt;/strong&gt; — Germany&amp;#39;s &lt;a href="https://www.bsi.bund.de/SharedDocs/Downloads/EN/BSI/Publications/TechGuidelines/TR03183/BSI-TR-03183-2_v2_1_0.pdf"&gt;BSI TR-03183 Part 2&lt;/a&gt; made SBOM delivery mandatory for products in scope. The &lt;a href="https://en.wikipedia.org/wiki/Cyber_Resilience_Act"&gt;EU Cyber Resilience Act (CRA)&lt;/a&gt; adopted the same requirement and entered into force on December 10, 2024, with a three-year transition period. Manufacturers selling digital products in the EU must produce and maintain SBOMs for conformity assessment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026&lt;/strong&gt; — CRA vulnerability reporting obligations apply from September 11, 2026, ahead of full applicability on December 11, 2027.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="https://community.devexpress.com/blogs/news/2026/sbom-announcement/sbom-timeline.png" alt="sbom-timeline"&gt;
&lt;p&gt;Under the CRA, SBOM obligation falls on the manufacturer of the finished product. You can run an SBOM generation tool against your project and assemble most of what you need. But tools that read package manifests cannot reliably see bundled NPM assets, statically-linked code, or license attribution for third-party components embedded at build time. A vendor-signed SBOM can fill these gaps and serve as stronger evidence when compared to tool-derived data. Our goal is to provide SBOMs that fit cleanly into workflows you already use.&lt;/p&gt;
&lt;h2 id="what-s-available-today-preview-"&gt;What&amp;#39;s Available Today (Preview)&lt;/h2&gt;
&lt;p&gt;DevExpress publishes digitally-signed CycloneDX 1.6 SBOM files for our .NET NuGet packages. Each SBOM is updated with every build. These files use our production format and signing pipeline — &amp;quot;preview&amp;quot; status reflects ongoing metadata alignment with &lt;a href="https://www.cisa.gov/sites/default/files/2025-08/2025_CISA_SBOM_Minimum_Elements.pdf"&gt;NTIA Minimum Elements&lt;/a&gt; and &lt;a href="https://www.bsi.bund.de/SharedDocs/Downloads/EN/BSI/Publications/TechGuidelines/TR03183/BSI-TR-03183-2_v2_1_0.pdf"&gt;BSI TR-03183&lt;/a&gt;, not file quality.&lt;/p&gt;
&lt;p&gt;Each SBOM:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lists first-party and third-party dependencies, including transitive dependencies.&lt;/li&gt;
&lt;li&gt;Includes a dependency graph for the package it describes.&lt;/li&gt;
&lt;li&gt;Lists corresponding NPM packages and their transitive dependencies when DevExpress .NET packages bundle client-side NPM assets.&lt;/li&gt;
&lt;li&gt;Marks NPM devDependencies (used during development but not shipped) with &lt;code&gt;&amp;quot;scope&amp;quot;: &amp;quot;excluded&amp;quot;&lt;/code&gt; for transparency.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These files can be consumed by standard SBOM analysis tools — including Dependency-Track, Trivy, and Grype.&lt;/p&gt;
&lt;h3 id="current-scope"&gt;Current Scope&lt;/h3&gt;
&lt;p&gt;This first release covers DevExpress .NET product packages (Blazor, WinForms, WPF, ASP.NET Core, Web Forms, MVC, and shared component libraries) published on NuGet.org for our current shipping version (v25.2.6). It does not yet cover VCL or DevExtreme product libraries, installers, demos, packages from our private NuGet feed, standalone assembly-level SBOMs, or earlier package versions. We are starting with this narrow scope so we can refine output based on customer requirements before broadening coverage.&lt;/p&gt;
&lt;div class="Note"&gt;For complete technical details — including known limitations, format specifics, and step-by-step guidance for Dependency-Track, Trivy, and Grype — see our &lt;a href="https://supportcenter.devexpress.com/ticket/details/t1312026/software-bill-of-materials-sbom-for-devexpress-net-assemblies-nuget-packages-javascript"&gt;SBOM discussion thread&lt;/a&gt;.&lt;/div&gt;
&lt;h2 id="your-feedback-matters"&gt;Your Feedback Matters&lt;/h2&gt;
&lt;p&gt;Our SBOM preview is now open to additional participants — particularly developers working on compliance, supply chain security, or vulnerability management for applications built with DevExpress components.&lt;/p&gt;
&lt;p&gt;If you are willing to test our SBOM files in your existing tooling and share what works (and what does not), please complete the survey below. After you submit, our team contacts you with download access and next steps. Survey participants also get a direct line to the product team. If you would prefer to discuss specifics outside the survey, you can also &lt;a href="https://www.devexpress.com/ask"&gt;open a private support ticket&lt;/a&gt;.&lt;/p&gt;
&lt;div data-survey-id="8bfc2c72-365b-4638-b3c5-c89875a66d49" data-survey-auth-required="true"&gt;&lt;/div&gt;</description>
      <pubDate>Thu, 07 May 2026 10:10:00 Z</pubDate>
      <dc:creator>Alex Chuev (DevExpress)</dc:creator>
      <dx:excerpt>If you ship apps to customers in the EU, the Cyber Resilience Act (CRA) will require an SBOM as part of your conformity documentation. SBOM generation and CRA compliance are top priorities for DevExpress, and CycloneDX SBOM files for our .NET NuGet packages are now available as a preview</dx:excerpt>
    </item>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:388286</guid>
      <link>https://community.devexpress.com/Blogs/news/archive/2026/04/27/microsoft-build-2026-is-coming.aspx</link>
      <category domain="https://community.devexpress.com/Tags/build">build</category>
      <title>Microsoft Build 2026 is coming!</title>
      <description>&lt;p&gt;...And we shall be there! Not in Seattle this year, but, for a change, in San Francisco. To be more accurate, Microsoft Build will be&amp;nbsp;at&amp;nbsp;&lt;span style="color:#000000;"&gt;Fort Mason Center in San Francisco, CA. for two full days, June 2-3. As is usual,&amp;nbsp;sessions will also be broadcast&amp;nbsp;online.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The main emphasis of Microsoft Build 2026 is going to be&amp;nbsp;AI. Not only how to use AI workflows and agents to write code and applications, but also how to provide AI capabilities to end-users to help them&amp;nbsp;use&amp;nbsp;those apps.&amp;nbsp;Naturally sessions will also cover how developers &amp;quot;supervise&amp;quot; output from AI agents&amp;nbsp;through testing, checking outputs for security, applicability, and so on. For more details on the sessions that will occur at Build, please follow &lt;a href="https://build.microsoft.com/en-US/home" title="Microsoft Build 2026 website"&gt;this link&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000000;"&gt;Like every year, DevExpress will have a booth in the Partner Hub, and we will be there to chat to attendees about what&amp;#39;s happening&amp;nbsp;with our next major releases coming up in late June, as well as how we&amp;#39;re supporting&amp;nbsp;the topics highlighted&amp;nbsp;in the Build sessions. We&amp;#39;ll talk about how we&amp;#39;re providing support for AI agents&amp;nbsp;when writing apps with our controls, as well as how we&amp;#39;re providing AI capabilities for end-users of the apps that use those&amp;nbsp;controls.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000000;"&gt;We look forward to seeing you at our booth if you&amp;#39;re going to Microsoft Build 2026. Do&amp;nbsp;please stop by and say hello!&lt;/span&gt;&lt;/p&gt;</description>
      <pubDate>Mon, 27 Apr 2026 15:10:00 Z</pubDate>
      <dc:creator>Julian Bucknall (DevExpress)</dc:creator>
    </item>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:388285</guid>
      <link>https://community.devexpress.com/Blogs/news/archive/2026/04/24/application-security-project-dependency-version-bumps-demystified-modern-security-realities-in-net-nuget-ecosystem.aspx</link>
      <category domain="https://community.devexpress.com/Tags/.NET">.NET</category>
      <category domain="https://community.devexpress.com/Tags/.net+core">.net core</category>
      <category domain="https://community.devexpress.com/Tags/JS">JS</category>
      <category domain="https://community.devexpress.com/Tags/npm">npm</category>
      <category domain="https://community.devexpress.com/Tags/NuGet">NuGet</category>
      <category domain="https://community.devexpress.com/Tags/security">security</category>
      <title>Application Security — Project Dependency "Version Bumps" Demystified or Modern Security Realities in .NET / NuGet Ecosystem</title>
      <description>&lt;p&gt;In this post, I want to show you how to effectively upgrade vulnerable third-party dependencies in your projects, highlight .NET industry best practices, and also clarify how DevExpress helps you mitigate security-related risks in general. For illustration purposes, I will use a System.Security.Cryptography.Xml-related security advisory, which Microsoft published in the GitHub Advisory database &lt;a href="https://github.com/advisories/GHSA-w3x6-4m5h-cxqf" target="_blank"&gt;last week&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You probably already know about this report from NuGet, Visual Studio, or &lt;a href="https://supportcenter.devexpress.com/ticket/details/t1326802/vulnerable-system-security-cryptography-xml-nuget-package-versions-10-0-0-10-0-5-9-0-0-9" target="_blank"&gt;DevExpress Support Center&lt;/a&gt;. And if not, it&amp;#39;s important to note that &lt;b&gt;such reports impact every NuGet package, which has direct or transitive dependencies on the highlighted package version&lt;/b&gt; (it&amp;#39;s not specific to DevExpress directly). Ultimately, even if such external advisories do not originate from DevExpress, they may impact DevExpress packages and DevExpress customers via a chain of system or third-party sub-dependencies. Hence, it&amp;#39;s still our responsibility as a component vendor to inform our customers, improve transparency and awareness of the best practices, update problematic dependencies of affected DevExpress packages in our new releases.&lt;/p&gt;

&lt;img src="https://community.devexpress.com/blogs/news/ghsa-fixed-versions.png" alt="" style="width:2009px;height:711px;border-width:1px;border-color:#c0c0c0;border-style:solid;"&gt;

&lt;p&gt;As a result of this System.Security.Cryptography.Xml advisory, you might see warnings in your Solution Explorer, NuGet Package Manager or just build output (example for .NET 8 projects). Since we also build .NET projects and use the same development tools daily, we knew about this new report right after its publication in the GitHub Advisory database on April 13-14th 2026 &lt;strong&gt;(much like you, other vendors or anyone else)&lt;/strong&gt;. Fortunately for all, a general fix (upgrade to the latest package version) is also available for all affected DevExpress and other vendor packages that were &lt;strong&gt;released prior to publishing such advisories&lt;/strong&gt; (for example, DevExpress v25.2.6 released on 07 Apr 2026 - a week before this particular report).&lt;/p&gt;

&lt;div class="Note"&gt;warning NU1901: Package &amp;#39;System.Security.Cryptography.Xml&amp;#39; 8.0.2 has a known low severity vulnerability, &lt;a href="https://github.com/advisories/GHSA-w3x6-4m5h-cxqf" rel="nofollow"&gt;https://github.com/advisories/GHSA-w3x6-4m5h-cxqf&lt;/a&gt;&lt;br&gt;DevExpress.Blazor imports the transitive package of System.Security.Cryptography.Xml&lt;/div&gt;

&lt;img src="https://community.devexpress.com/blogs/news/image_9.png" alt=""&gt;

&lt;h2&gt;How to Fix This&lt;/h2&gt;
&lt;h3&gt;General Fix Idea (Applicable to All Methods)&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The beauty of such simple &amp;quot;version bump&amp;quot; vulnerabilities is that you can easily fix it yourself immediately - without awaiting anyone (vendors, new package versions, etc).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can bump the version right in your project for affected third-party dependencies (such as Microsoft .NET System.XXX or others), as described in the &amp;quot;&lt;em&gt;How do I fix the issue?&lt;/em&gt;&amp;quot; section of the official advisory. Anyone can apply this fix at their convenience (even &amp;quot;within hours&amp;quot; of publication of the original security advisory in the CVE / GHSA database), because in this instance it&amp;#39;s literally one line of code in one or a few places only.&lt;/p&gt;

&lt;img src="https://community.devexpress.com/blogs/news/ghsa-how-to-fix.png" alt="" style="width:2258px;height:1646px;border-width:1px;border-color:#c0c0c0;border-style:solid;"&gt;

&lt;p&gt;I also want to emphasize that when a vulnerability occur in a system or core .NET library, many other dependent system, .NET BCL, and vendor libraries are impacted. For example, System.Security.Cryptography.Xml is used by System.ServiceModel.Http, System.ServiceModel.Primitives, System.ServiceModel and others. They are also used directly or indirectly in a dozen more packages - all are often used in many apps of even medium complexity (I am not even talking about complex apps). You will have to update those dependencies anyway, regardless DevExpress or any other impacted package vendor/third-party.&lt;/p&gt;

&lt;p&gt;Notwithstanding the negative effects of dealing with a vulnerability, NuGet and its best practices such as Central Package Management (CPM) exist in the development world - all to deal with such incidents quickly and to address modern realities effectively.

&lt;/p&gt;&lt;h3&gt;Method #1: You Have a Few Projects Only or Are NOT Using Central Package Management (CPM)&lt;/h3&gt;

&lt;div class="Note"&gt;&lt;strong&gt;Applicability&lt;/strong&gt;: Simple applications (~1-3-5 projects in your solution), no CPM yet.&lt;br&gt;&lt;strong&gt;Urgency&lt;/strong&gt;: High (apply immediately).&lt;br&gt;&lt;strong&gt;Complexity&lt;/strong&gt;: Medium - Temporarily copy and maintain one code line in &lt;strong&gt;X&lt;/strong&gt; files (the number of your projects).&lt;br&gt;&lt;strong&gt;Risks&lt;/strong&gt;: Low.&lt;/div&gt;

&lt;p&gt;The standard Microsoft solution is to add a direct NuGet package reference (&lt;strong&gt;System.Security.Cryptography.Xml&lt;/strong&gt; in this case, but it can be another third-party package) to your required projects (CSPROJ/VBPROJ) and set its &lt;strong&gt;VersionOverride&lt;/strong&gt; property to the patched version from the advisory (for example, &lt;strong&gt;8.0.3&lt;/strong&gt; for .NET 8):&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;.NET 8&lt;/strong&gt;: &amp;lt;PackageReference Include=&amp;quot;System.Security.Cryptography.Xml&amp;quot; VersionOverride=&amp;quot;8.0.3&amp;quot; /&amp;gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;.NET 9&lt;/strong&gt;: &amp;lt;PackageReference Include=&amp;quot;System.Security.Cryptography.Xml&amp;quot; VersionOverride=&amp;quot;9.0.15&amp;quot; /&amp;gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;.NET 10&lt;/strong&gt;: &amp;lt;PackageReference Include=&amp;quot;System.Security.Cryptography.Xml&amp;quot; VersionOverride=&amp;quot;10.0.6&amp;quot; /&amp;gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As you can see, this is a one-line solution, which you can copy into required projects where problematic direct or transitive dependencies were detected. In my example, I copied it into 2 projects only (so, 2 code lines in total to maintain &lt;strong&gt;temporarily&lt;/strong&gt;).&lt;/p&gt;

&lt;h3&gt;Method #2: You Have Multiple Projects or Are Using Central Package Management (CPM)&lt;/h3&gt;

&lt;div class="Note"&gt;&lt;strong&gt;Applicability&lt;/strong&gt;: Medium to complex applications (more than 5 projects in your solution), CPM configured.&lt;br&gt;&lt;strong&gt;Urgency&lt;/strong&gt;: High (apply immediately).&lt;br&gt;&lt;strong&gt;Complexity&lt;/strong&gt;: Low - Temporarily copy and maintain one code line in one file.&lt;br&gt;&lt;strong&gt;Risks&lt;/strong&gt;: Low.&lt;br&gt;&lt;/div&gt;

&lt;p&gt;If you have too many projects so that even the one-line solution is not practical to copy/maintain, then you must seriously consider using &lt;a href="https://learn.microsoft.com/en-us/nuget/consume-packages/central-package-management"&gt;Central Package Management (CPM)&lt;/a&gt;. &lt;strong&gt;CPM is the best or recommended development practice regardless this vulnerability discussion anyway.&lt;/strong&gt;&lt;/p&gt;

&lt;img src="https://community.devexpress.com/blogs/news/image_8.png" alt="" style="width:3524px;height:1594px;border-width:1px;border-color:#c0c0c0;border-style:solid;"&gt;

&lt;p&gt;Once you configure CPM for your solution, you can add a global package reference to your Directory.Packages.props file:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;.NET 8&lt;/strong&gt;: &amp;lt;GlobalPackageReference Include=&amp;quot;System.Security.Cryptography.Xml&amp;quot; Version=&amp;quot;8.0.3&amp;quot; /&amp;gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;.NET 9&lt;/strong&gt;: &amp;lt;GlobalPackageReference Include=&amp;quot;System.Security.Cryptography.Xml&amp;quot; Version=&amp;quot;9.0.15&amp;quot; /&amp;gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;.NET 10&lt;/strong&gt;: &amp;lt;GlobalPackageReference Include=&amp;quot;System.Security.Cryptography.Xml&amp;quot; Version=&amp;quot;10.0.6&amp;quot; /&amp;gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Regardless how many projects you have in your .NET solution (5, 100, 200, etc.), this is always a one-line solution to maintain &lt;strong&gt;temporarily&lt;/strong&gt; - that is the beauty of CPM in action.&lt;/p&gt;

&lt;img src="https://community.devexpress.com/blogs/news/image_6.png" alt="" style="width:558px;height:507px;"&gt;

&lt;p&gt;CPM is nowadays also super-fast to add to your non-CPM solution with AI assistants. If you already maintain a Directory.Packages.props, replacing &amp;quot;PackageVersion&amp;quot; with &amp;quot;GlobalPackageReference&amp;quot; is fast too with or without AI.&lt;/p&gt;

&lt;img src="https://community.devexpress.com/blogs/news/image_5.png" alt=""&gt;

&lt;h3 id="additional-information"&gt;Method #3: Await &amp;amp; Install a New/Fixed DevExpress Build&lt;/h3&gt;

&lt;div class="Note"&gt;&lt;strong&gt;Applicability&lt;/strong&gt;: Applications of any complexity, with or without CPM.&lt;br&gt;&lt;strong&gt;Urgency&lt;/strong&gt;: Low (await a few weeks).&lt;br&gt;&lt;strong&gt;Complexity&lt;/strong&gt;: Medium - Download a new version and re-test your application completely.&lt;br&gt;&lt;strong&gt;Risks&lt;/strong&gt;: Low - for the official maintenance update; High - for a hot-fix/intermediate build.&lt;/div&gt;

&lt;p&gt;Affected DevExpress packages are typically updated in the next minor release according to our &lt;a href="https://docs.devexpress.com/GeneralInformation/403365/security/security?utm_source=SupportCenter&amp;amp;utm_medium=website&amp;amp;utm_campaign=docs-feedback&amp;amp;utm_content=T1326802#security-advisories-and-product-update-process"&gt;Security Advisories and Product Update Process&lt;/a&gt;. This usually takes a few weeks or so.&lt;/p&gt;

&lt;p&gt;If you wish, you can request a hot-fix/intermediate build as well. For example, for this particular System.Security.Cryptography.Xml vulnerability we updated our packages and published a fixed night build at &lt;a href="https://downloads.devexpress.com/HotFixes/DXP/v25.2" style="color:#337ab7;"&gt;https://downloads.devexpress.com/HotFixes/DXP/v25.2&lt;/a&gt;. NOTE: &lt;a href="https://www.devexpress.com/support/eulas/hotfix-policy.xml" style="color:#337ab7;"&gt;review our hot-fix policy first&lt;/a&gt; before applying.
&lt;/p&gt;

&lt;h2&gt;Frequently Asked Questions (FAQ)&lt;/h2&gt;

&lt;h3&gt;Does DevExpress release builds when it already &amp;quot;knows&amp;quot; about a vulnerability such as System.Security.Cryptography.Xml 8.0.2?&lt;/h3&gt;

&lt;p&gt;No. In this instance, DevExpress v25.2.6 was released on 07 Apr 2026, many days before the aforementioned vulnerability was even published/known to the world. &lt;/p&gt;

&lt;p&gt;DevExpress uses a multi-layered scanning strategy for every PR (code repositories and container images are continuously and automatically scanned for vulnerabilities during the CI/CD process) &lt;strong&gt;prior to release&lt;/strong&gt;. This includes Static Application Security Testing (SAST) for product source code, Software Composition Analysis (SCA) for vulnerable third-party libraries/license compliance, antiviral software installation and artifact scanning. High-risk vulnerabilities trigger an automatic &amp;#39;Build Fail&amp;#39;. DevExpress employs a combination of commercial and internally managed security tools (including, but not limited to Veracode, Dependabot, CodeQL, NuGet Audit, VirusTotal, etc).&lt;/p&gt;

&lt;p&gt;For more information, please review &lt;a href="https://www.devexpress.com/support/information-security.xml" style="color:#337ab7;"&gt;Information Security&lt;/a&gt; and &lt;a href="https://docs.devexpress.com/GeneralInformation/403365/security/security" style="color:#337ab7;"&gt;Security - What You Need to Know&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;How often similar security advisories for system/core or popular 3rd-party packages are reported?&lt;/h3&gt;

&lt;p&gt;Quite many every day - it&amp;#39;s best to estimate it for yourself at &lt;a href="https://github.com/advisories" target="_blank"&gt;https://github.com/advisories&lt;/a&gt; (filter by NuGet, NPM, or other keywords). This is also not the first and not the last vulnerability in a system/core library. For example, 3 security advisories were published for System.Security.Cryptography.Xml alone in less than 2 years. And I am not even referring to others in popular SQL Client, JSON, OData, and other libraries with even more dependencies.&lt;/p&gt;

&lt;p&gt;To better understand the situation, let&amp;#39;s make a thought experiment: imagine that a vendor started publishing new official builds in response to each and every security advisory immediately. For this (in theory), one would need the previous official build, bump the affected NuGet package version (such as System.Security.Cryptography.Xml), re-build, re-run automatic tests and security checks, and publish a new official build. As a result of this experiment, customers would need to deal with 3-5 new minors a week. That rough number is only considering the current CVE/GHSA update rate for .NET - for JS/NPM it would be even more frequent. As you may understand, not many customers or businesses would want such an update carousel.&lt;/p&gt;

&lt;img src="https://community.devexpress.com/blogs/news/image_4.png" alt="" style="border-width:1px;border-color:#c0c0c0;border-style:solid;"&gt;

&lt;h3&gt;How often DevExpress &amp;quot;bumps versions&amp;quot; of their .NET packages internally in response to security advisories for external NuGet packages?&lt;/h3&gt;

&lt;p&gt;Multiple times every month or so. To give you a full picture, DevExpress v25.2 .NET packages depend on over 150+ system/core .NET packages (based on our &amp;quot;c:\Program Files\DevExpress 25.2\Components\Sources\Directory.Packages.props&amp;quot; file or our public &lt;a href="https://supportcenter.devexpress.com/ticket/details/t1312026/software-bill-of-materials-sbom-for-devexpress-net-assemblies-nuget-packages-javascript" target="_blank"&gt;SBOM artifacts&lt;/a&gt;, which you can check for yourself). Our .NET packages often include our JS packages as assets, these JS packages depend on external JS/NPM packages, and so on - you got the idea or the high chances of a &amp;quot;version bump&amp;quot; at such a scale.&lt;/p&gt;

&lt;p&gt;Good news is that we heavily rely on CPM, so this &amp;quot;version bumping&amp;quot; itself is now a mechanical routine - it just takes time and discipline from our product teams. This is basically what every developer of any serious or complex application/solution is doing nowadays, because security matters.&lt;/p&gt;

&lt;h3&gt;Why does not DevExpress release a new/fixed build within hours after a security advisory is published?&lt;/h3&gt;

&lt;p&gt;As noted in Method #3, we follow our &lt;a href="https://docs.devexpress.com/GeneralInformation/403365/security/security#security-advisories-and-product-update-process" style="color:#337ab7;"&gt;Security Advisories and Product Update Process&lt;/a&gt; and update affected DevExpress packages  in the next minor release (in a few weeks or so &lt;strong&gt;on purpose&lt;/strong&gt;). All our builds must pass standard testing procedures. We do our best to test our software and it takes time (for example, we intentionally did not release v25.2.7 &amp;quot;within hours&amp;quot;). We simply do not want our customers rely on poorly tested software (and potentially experience bigger issues with the upgrade). &lt;/p&gt;

&lt;p&gt;Fortunately, the current release cadence suits the majority of our customers and proved itself over the years well. In urgent cases, customers can either apply a one-line solution in their projects or request a hot-fix/intermediate build. That is also why Microsoft has Patch Tuesday &lt;strong style="color:#333333;"&gt;monthly &lt;/strong&gt;and NOT &amp;quot;hourly&amp;quot;, and many other vendors follow similar security and testing protocols. Otherwise, it would be a mess for all vendors and customers in the .NET ecosystem, for JS ecosystem it would be even worse due to a different NPM package update strategies and the number of updated packages. &lt;strong&gt;In other words, the solution should never be worse than the original problem.&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id="additional-information" style="color:#505050;font-weight:600;"&gt;See Also&lt;/h2&gt;

&lt;p&gt;Microsoft clarified this general pattern in their blogs and docs, because this version upgrade is needed regularly:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;&lt;a href="https://devblogs.microsoft.com/dotnet/nugetaudit-2-0-elevating-security-and-trust-in-package-management/#how-to-upgrade-transitive-packages" rel="nofollow"&gt;NuGetAudit 2.0: Elevating Security and Trust in Package Management&lt;/a&gt; (see the &amp;quot;How to upgrade transitive packages&amp;quot; section)&lt;/li&gt;&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/nuget/consume-packages/central-package-management#overriding-package-versions" rel="nofollow"&gt;Overriding Package Versions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We also described how to fix this and similar customer issues at &lt;a href="https://community.devexpress.com/blogs/news/archive/2024/07/18/dot-net-nuget-package-audit-and-false-positive-security-warnings.aspx"&gt;.NET — About NuGet Package Audit and &amp;quot;False-Positive&amp;quot; Security Warnings&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Please let me know if you have any DevExpress-related questions or suggestions.&lt;/p&gt;&lt;p&gt;&lt;span&gt;Thanks,&lt;/span&gt;&lt;br&gt;&lt;span&gt;Dennis Garavsky&lt;/span&gt;&lt;br&gt;&lt;span&gt;Principal Product Manager&lt;/span&gt;&lt;br&gt;&lt;a href="mailto:dennis@devexpress.com" title="Email me if you have questions or suggestions"&gt;dennis@devexpress.com&lt;/a&gt;&lt;br&gt;&lt;/p&gt;</description>
      <pubDate>Fri, 24 Apr 2026 09:44:00 Z</pubDate>
      <dc:creator>Dennis Garavsky (DevExpress)</dc:creator>
    </item>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:388284</guid>
      <link>https://community.devexpress.com/Blogs/news/archive/2026/04/17/application-security-stronger-hashes-and-safer-passwords.aspx</link>
      <category domain="https://community.devexpress.com/Tags/.NET">.NET</category>
      <category domain="https://community.devexpress.com/Tags/.net+core">.net core</category>
      <category domain="https://community.devexpress.com/Tags/Architecture">Architecture</category>
      <category domain="https://community.devexpress.com/Tags/ASP.NET">ASP.NET</category>
      <category domain="https://community.devexpress.com/Tags/Blazor">Blazor</category>
      <category domain="https://community.devexpress.com/Tags/Dashboard">Dashboard</category>
      <category domain="https://community.devexpress.com/Tags/Data+Access">Data Access</category>
      <category domain="https://community.devexpress.com/Tags/Office+File+API">Office File API</category>
      <category domain="https://community.devexpress.com/Tags/Reporting">Reporting</category>
      <category domain="https://community.devexpress.com/Tags/security">security</category>
      <category domain="https://community.devexpress.com/Tags/WinForms">WinForms</category>
      <category domain="https://community.devexpress.com/Tags/WPF">WPF</category>
      <category domain="https://community.devexpress.com/Tags/XAF">XAF</category>
      <title>Application Security — Stronger Hashes and Safer Passwords</title>
      <description>&lt;p&gt;Every application that stores passwords makes an implicit bet: that the hashing
algorithm it chose will remain strong enough to resist attacks for as long as
those hashes exist. It’s worth revisiting that bet regularly. This post walks
through the reasoning behind some recent changes we’ve made to password hashing
across DevExpress components, and covers broader principles that apply whether
you use our tools or not.&lt;/p&gt;
&lt;h2 id="a-quick-primer-on-password-hashing"&gt;A Quick Primer on Password Hashing&lt;/h2&gt;
&lt;p&gt;A hash function takes an input - say, a password - and produces a fixed-length
string that looks nothing like the original. The critical property is that this
transformation is one-way: given the hash, it should be computationally
impossible to recover the original password.&lt;/p&gt;
&lt;p&gt;Here’s a concise example using the .NET class &lt;code&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.rfc2898derivebytes?view=net-10.0" target="_blank"&gt;Rfc2898DeriveBytes&lt;/a&gt;&lt;/code&gt;, which
implements the PBKDF2 algorithm:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp" data-line-numbers="true"&gt;using System.Security.Cryptography;

byte[] salt = RandomNumberGenerator.GetBytes(16);
int iterations = 600_000;

byte[] hash = Rfc2898DeriveBytes.Pbkdf2(
    password: &amp;quot;correct-horse-battery-staple&amp;quot;,
    salt: salt,
    iterations: iterations,
    hashAlgorithm: HashAlgorithmName.SHA512,
    outputLength: 64);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The salt ensures that identical passwords produce different hashes. The
iteration count controls how much computational work is required to produce each
hash, making brute-force attacks proportionally more expensive. And the choice
of hash algorithm matters more than you might think, as I’ll discuss below.&lt;/p&gt;&lt;div class="Note"&gt;&lt;span style="color:#333333;"&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: The low-level code above is intended primarily for demonstration purposes. For production-ready password hashing and storage, you may&amp;nbsp;end up with a more sophisticated implementation based on Rfc2898DeriveBytes and other built-in .NET helpers. For instance, in modern ASP.NET Core&amp;nbsp;applications with Identity (Blazor, Web API, Minimal APIs, ASP.NET Core MVC, Razor Pages, gRPC), you can use&amp;nbsp;&lt;/span&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.identity.passwordhasher-1?view=aspnetcore-10.0" style="color:#337ab7;"&gt;PasswordHasher&amp;lt;TUser&amp;gt;&lt;/a&gt;&amp;nbsp;&lt;span style="color:#333333;"&gt;(Microsoft&amp;#39;s recommendation -&amp;nbsp;&lt;/span&gt;&lt;a href="https://learn.microsoft.com/en-us/aspnet/core/security/data-protection/consumer-apis/password-hashing?view=aspnetcore-10.0" target="_blank"&gt;see below&lt;/a&gt;&lt;span style="color:#333333;"&gt;)&lt;/span&gt;&lt;span style="color:#333333;"&gt;. Similar APIs can be used for other platforms: our XAF framework (for Blazor/WinForms UI and Web API)&amp;nbsp;includes a&amp;nbsp;&lt;/span&gt;&lt;a href="https://docs.devexpress.com/eXpressAppFramework/112649/data-security-and-safety/security-system/authentication/passwords-in-the-security-system#access-passwords-in-code" style="color:#337ab7;"&gt;PasswordCryptographer&lt;/a&gt;&lt;span style="color:#333333;"&gt;&amp;nbsp;helper powered by Rfc2898DeriveBytes&amp;nbsp;with additional configuration options.&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="color:#333333;"&gt;&lt;img src="https://community.devexpress.com/blogs/news/image_3.png" alt=""&gt;&lt;br&gt;&lt;/span&gt;&lt;br&gt;&lt;/p&gt;
&lt;h2 id="document-protection-sha-512-for-office-documents"&gt;Document Protection: SHA-512 for Office Documents&lt;/h2&gt;
&lt;p&gt;If you’ve used document protection in Word-compatible file formats, you know
that it’s an “advisory” protection mechanism. It signals that a document
shouldn’t be edited, but it’s ultimately up to the consuming application to
check and enforce that flag. Document protection is not an encryption mechanism
designed to provide strong security.&lt;/p&gt;
&lt;p&gt;Even so, the protection password hash is stored inside the document. While these
passwords are often shared with collaborators and hopefully aren’t reused for
online banking, there’s still no good reason to make it easy for someone to
brute-force the original password. In v26.1, our
&lt;a href="https://docs.devexpress.com/OfficeFileAPI/DevExpress.XtraRichEdit.API.Native.Document.Protect.overloads" rel="nofollow noreferrer" target="_blank"&gt;&lt;code&gt;Document.Protect&lt;/code&gt;&lt;/a&gt;
method&amp;nbsp;uses the strongest hash function supported by the Office format, as
&lt;a href="https://learn.microsoft.com/en-us/openspecs/office_standards/ms-oe376/fb220a2f-88d4-488c-a9b7-e094756b6699" rel="nofollow noreferrer" target="_blank"&gt;documented by
Microsoft&lt;/a&gt;. You
can find the &lt;a href="https://supportcenter.devexpress.com/ticket/details/t1322324/document-protection-password-protected-documents-now-use-sha-512" rel="nofollow noreferrer" target="_blank"&gt;full details in our breaking change notice&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;See Also:&amp;nbsp;&lt;/strong&gt;&lt;a href="https://community.devexpress.com/Blogs/news/archive/2026/05/29/application-security-documents-are-untrusted-input.aspx"&gt;Application Security — Documents Are Untrusted Input&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="digital-signatures-ocspclient-defaults-to-sha-512"&gt;Digital Signatures: OcspClient Defaults to SHA-512&lt;/h2&gt;
&lt;p&gt;Password hashes aren’t the only place where hash strength matters. Digital
signatures rely on hash functions too, and a weak hash can undermine the
integrity guarantees that a signature is supposed to provide. With v26.1, the
&lt;code&gt;OcspClient&lt;/code&gt; class used for OCSP (Online Certificate Status Protocol) responses
in our digital signature workflow &lt;a href="https://supportcenter.devexpress.com/ticket/details/t1322321/digital-signatures-ocspclient-now-uses-sha-512-by-default" rel="nofollow noreferrer" target="_blank"&gt;now uses SHA-512 by
default&lt;/a&gt;. This
is a straightforward upgrade that brings the default in line with current best
practices.&lt;/p&gt;
&lt;h2 id="xaf-security-system-sha-512-with-600000-iterations"&gt;XAF Security System: SHA-512 with 600000 Iterations&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://docs.devexpress.com/eXpressAppFramework/113366/data-security-and-safety/security-system" target="_blank"&gt;XAF’s built-in Security System&lt;/a&gt; handles full user account management, including
password storage. This is the scenario where hashing strength matters most,
since these are real user passwords protecting real application access.&lt;/p&gt;
&lt;p&gt;With v26.1, we’re configuring the default hash mechanism to use SHA-512 with
600000 iterations of PBKDF2. This is a significant step up from previous
defaults. Because this change affects how stored passwords are verified, it can be considered a&amp;nbsp;&lt;a href="https://supportcenter.devexpress.com/ticket/details/t1325657/xaf-security-a-stronger-password-hashing-algorithm-has-been-configured" rel="nofollow noreferrer" target="_blank"&gt;breaking change (full documentation and migration guidance is
available
here&lt;/a&gt;). We’ll
provide detailed steps to help you update your application and migrate existing
password hashes to the new configuration.&lt;/p&gt;
&lt;h2 id="why-these-specific-choices"&gt;Why These Specific Choices?&lt;/h2&gt;
&lt;p&gt;You might wonder: why SHA-512? Why 600000 iterations? Why not something else entirely?&lt;/p&gt;
&lt;p&gt;The short answer is that we’re following the &lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html" rel="nofollow noreferrer" target="_blank"&gt;OWASP Password Storage Cheat
Sheet&lt;/a&gt;,
specifically its guidance on PBKDF2 for environments that require FIPS-140
compliance. OWASP is widely regarded as the authoritative source for application
security best practices, and their recommendations are well-researched,
regularly updated, and practical.&lt;/p&gt;
&lt;p&gt;If you handle passwords in your own applications - whether for storage,
verification, or any other processing - reading the OWASP guidance in detail is
highly recommended. It’s clearly written and covers important related concepts like
the salts mentioned above (random values mixed into each hash to prevent precomputed attacks)
and peppers (application-level secrets added as an extra layer of defense).&lt;/p&gt;
&lt;p&gt;That said, there are two important points worth expanding on in the context of
the choices we made.&lt;/p&gt;&lt;div class="Note"&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: As of this writing, SHA-256 remains a fully valid, supported, and widely recommended choice (including the current OWASP and NIST guidance). Despite a larger output size, SHA-512 can be as fast as SHA-256 on modern 64-bit hardware. In practice, the overall security is driven by many more factors (like iteration count, rate limiting, and algorithm design, etc.) than the output length of a specific SHA-XXX algorithm.&lt;br&gt;&lt;/div&gt;
&lt;h2 id="point-1-iteration-count-is-a-trade-off-and-rate-limiting-is-non-negotiable"&gt;Point 1: Iteration Count Is a Trade-Off, and Rate Limiting Is Non-Negotiable&lt;/h2&gt;
&lt;p&gt;The OWASP guidance for PBKDF2 with SHA-512 suggests an iteration count that is
actually somewhat lower than the 600000 we adopted for XAF. That’s because
iteration count is a trade-off between security and performance: more iterations
mean more work for an attacker, but also more work for your server on every
legitimate login.&lt;/p&gt;
&lt;p&gt;To make an informed choice, think about where and when your application computes
password hashes. How frequently does it happen? What does the load look like
during peak usage? Measure how long a single hash computation takes on your
hardware. These data points, combined with the OWASP guidance, will help you
find the right balance for your specific situation.&lt;/p&gt;
&lt;p&gt;This line of thinking leads to a critical complementary measure: rate
limiting. No matter how strong your hash function is, if an attacker can make
unlimited login attempts, they have unlimited opportunities to guess
passwords. Rate limiting caps the number of attempts in a given time window,
making brute-force attacks impractical even against weaker hashes.&lt;/p&gt;
&lt;p&gt;You want this at two levels. At the application level, lock out individual
accounts after repeated failures. ASP.NET Core Identity supports this through
the
&lt;a href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.identity.lockoutoptions.maxfailedaccessattempts" rel="nofollow noreferrer" target="_blank"&gt;&lt;code&gt;LockoutOptions.MaxFailedAccessAttempts&lt;/code&gt;&lt;/a&gt;
property in the &lt;code&gt;IdentityOptions.Lockout&lt;/code&gt; configuration, and the XAF Security
System offers equivalent functionality with the
&lt;a href="https://docs.devexpress.com/eXpressAppFramework/DevExpress.ExpressApp.Security.ISecurityUserLockout" rel="nofollow noreferrer" target="_blank"&gt;&lt;code&gt;ISecurityUserLockout&lt;/code&gt;&lt;/a&gt;
interface. At the edge, protect your infrastructure from being overwhelmed, by
using a WAF (Web Application Firewall), Cloudflare, or a reverse proxy like
Nginx or Caddy with built-in rate limiting. Use both techniques: account lockout
and infrastructure protection solve different problems.&lt;/p&gt;
&lt;h2 id="point-2-pbkdf2-vs-memory-hard-algorithms---the-state-of-the-art"&gt;Point 2: PBKDF2 vs. Memory-Hard Algorithms - the State of the Art&lt;/h2&gt;
&lt;p&gt;If you read the OWASP cheat sheet closely, you’ll notice that PBKDF2 is
positioned as the last choice in their ranked list of recommended
algorithms. OWASP explicitly notes that PBKDF2 is the best option only when
FIPS-140 compliance is required.&lt;/p&gt;
&lt;p&gt;The reason is architectural. PBKDF2 is a CPU-bound algorithm, its security
relies on requiring many sequential computations. The problem is that modern
GPUs and purpose-built ASIC chips can perform these computations orders of magnitude
faster than general-purpose CPUs. An attacker with access to specialized
hardware can brute-force PBKDF2 hashes far more efficiently than a defender’s
server can compute them. Some hardware of this nature can be rented conveniently
in the cloud, making it accessible to a wide range of attackers.&lt;/p&gt;
&lt;p&gt;OWASP’s preferred alternatives are memory-hard algorithms like Argon2id and
scrypt. These algorithms are designed to require large amounts of memory during
computation, which makes them resistant to GPU and ASIC attacks. Specialized
hardware is fast at computation but has limited memory bandwidth, which levels
the playing field.&lt;/p&gt;
&lt;p&gt;However, memory-hard algorithms come with trade-offs of their own. Consider the
OWASP-recommended minimum for Argon2id: 19 MiB of memory and 2 iterations per
hash computation. If you need to support just 100 concurrent login attempts,
that’s already 1.9 GiB of memory dedicated solely to password hashing. The
calculation for your maximum concurrent user count becomes a fundamentally
different exercise than with CPU-bound algorithms.&lt;/p&gt;
&lt;p&gt;There’s also a practical consideration in the .NET ecosystem: Argon2id and
scrypt are not natively supported by the .NET runtime. Using them requires
third-party libraries, which introduces dependencies on external maintainers for
security-critical code. Many developers and organizations reasonably conclude
that a well-configured, natively supported algorithm - PBKDF2 with SHA-512 and a
high iteration count - is preferable to taking on that dependency risk. This is
the reasoning behind our choice for DevExpress products.&lt;/p&gt;
&lt;h2 id="the-bottom-line"&gt;The Bottom Line&lt;/h2&gt;
&lt;p&gt;Password hashing is one of those areas where “good enough” has a shelf
life. Algorithms that were considered strong a few years ago may no longer
provide adequate protection against modern hardware. The updates we’re shipping
in v26.1 reflect current best practices, and we encourage you to review your own
applications with the same critical eye, if you handle passwords in any capacity.&lt;/p&gt;

&lt;h2&gt;Your Feedback Matters!&lt;/h2&gt;
&lt;div data-survey-id="b31c0c9e-b420-4b2b-9501-2a16d14dd7af" data-survey-auth-required="false"&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 17 Apr 2026 11:00:00 Z</pubDate>
      <dc:creator>Oliver Sturm (DevExpress)</dc:creator>
    </item>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:388282</guid>
      <link>https://community.devexpress.com/Blogs/news/archive/2026/04/02/application-security-why-you-cant-protect-your-connection-string.aspx</link>
      <category domain="https://community.devexpress.com/Tags/.NET">.NET</category>
      <category domain="https://community.devexpress.com/Tags/.net+core">.net core</category>
      <category domain="https://community.devexpress.com/Tags/Architecture">Architecture</category>
      <category domain="https://community.devexpress.com/Tags/Backend">Backend</category>
      <category domain="https://community.devexpress.com/Tags/Data+Access">Data Access</category>
      <category domain="https://community.devexpress.com/Tags/database">database</category>
      <category domain="https://community.devexpress.com/Tags/Desktop">Desktop</category>
      <category domain="https://community.devexpress.com/Tags/Frontend">Frontend</category>
      <category domain="https://community.devexpress.com/Tags/Middle+Tier">Middle Tier</category>
      <category domain="https://community.devexpress.com/Tags/ORM">ORM</category>
      <category domain="https://community.devexpress.com/Tags/RDBMS">RDBMS</category>
      <category domain="https://community.devexpress.com/Tags/REST">REST</category>
      <category domain="https://community.devexpress.com/Tags/security">security</category>
      <category domain="https://community.devexpress.com/Tags/webapi">webapi</category>
      <category domain="https://community.devexpress.com/Tags/windows">windows</category>
      <category domain="https://community.devexpress.com/Tags/WinForms">WinForms</category>
      <category domain="https://community.devexpress.com/Tags/WPF">WPF</category>
      <title>Application Security — Why One Does Not Simply Protect a Data Store Connection String and Other Login Credentials?</title>
      <description>&lt;p&gt;A developer asks: “How do I protect my connection string in a desktop
application?”&lt;/p&gt;
&lt;p&gt;This is one of the most common security questions in .NET development, and it
sounds like it should have a straightforward answer. But there is a fundamental
problem we need to analyze.&lt;/p&gt;
&lt;p&gt;When an application connects to a service, SQL Server, a REST API, any service
at all, it needs credentials. That’s unavoidable.&lt;/p&gt;
&lt;p&gt;Sometimes those are long-lived “root” credentials: usernames and passwords, API
keys, client secrets. Sometimes they’re derived tokens with limited scope and
lifetime. Sometimes they come from the environment, like Windows
Authentication. The exact form doesn’t matter.&lt;/p&gt;
&lt;p&gt;What matters is this:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;At the moment your application uses those credentials, it has everything it
needs to act on them.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And that leads directly to a part which is easily underestimated.&lt;/p&gt;
&lt;h2 id="the-reality-of-using-credentials"&gt;The reality of using credentials&lt;/h2&gt;
&lt;p&gt;If your application can use credentials, then anything that can control your
application can use them too.&lt;/p&gt;
&lt;p&gt;On a typical desktop system, the user fully controls the machine. That means
they can inspect memory, attach a debugger, intercept calls, or simply drive the
application in ways you didn’t intend.&lt;/p&gt;
&lt;p&gt;To illustrate: a connection string used by an application through Entity
Framework or ADO.NET can typically be found in plain text in a process memory
dump, using standard tools like WinDbg or dotnet-dump. No reverse engineering
required.&lt;/p&gt;
&lt;p&gt;Managed enterprise environments can raise the cost of such attacks
significantly, through tools like AppLocker, WDAC, or restricted user
accounts. But the fundamental dynamic does not change: the complexity of
exploitation increases, while the possibility remains. This applies to WPF or
Windows Forms applications, other types of native applications, and also to
server applications like those served by a web server.&lt;/p&gt;
&lt;p&gt;If your application uses a secret to access a remote resource, you can try to
hide the secret. You can encrypt it at rest. You can obfuscate it.&lt;/p&gt;
&lt;p&gt;But none of that changes the core fact: &lt;strong&gt;the application itself is already
authenticated, at the point where it works with the remote resource&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;An attacker doesn’t need to extract the password if they can just make your
application run the query, call the API, or perform the operation on their
behalf.&lt;/p&gt;
&lt;p&gt;This is a key point that many discussions miss. The problem is not just that
secrets can be stolen. It’s that the application already embodies the permission
those secrets grant.&lt;/p&gt;
&lt;h2 id="so-can-we-protect-connection-strings"&gt;So can we protect connection strings?&lt;/h2&gt;
&lt;p&gt;Not in the way people often expect. If someone can run code on the same machine,
under the same user account as your application, they can make your application
do anything it is allowed to do. That’s not a framework limitation or a missing
feature. It’s simply how software works.&lt;/p&gt;
&lt;p&gt;Microsoft’s own guidance reflects this reality indirectly. For example, Entity
Framework explicitly recommends &lt;strong&gt;not&lt;/strong&gt; relying on storing connection strings
with sensitive information directly in application configuration, and instead
using more secure patterns where possible (see: &lt;a href="https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/ef/security-considerations#secure-the-connection-string" rel="nofollow noreferrer" target="_blank"&gt;Entity Framework Core
connection string
guidance&lt;/a&gt;). Guidelines
for ASP.NET Core go in the same direction, &lt;a href="https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-10.0#security-and-user-secrets" rel="nofollow noreferrer" target="_blank"&gt;you can read them
here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For development, Microsoft recommends the use of &lt;a href="https://learn.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-10.0" rel="nofollow noreferrer" target="_blank"&gt;the Secret Manager
tool&lt;/a&gt;. Note
that it is meant to be used for development purposes only! Local storage
mechanisms are for convenience and isolation - not for real security
boundaries. The fundamental issue isn’t changed by the use of these tools:
locally stored secrets are not safe from the user of the machine.&lt;/p&gt;
&lt;p&gt;The .NET platform itself does not provide a single, clear, production-ready
solution for secure storage on client machines. Its built-in configuration
system can read values from many sources, but it does not make those sources
secure.&lt;/p&gt;
&lt;p&gt;In Microsoft’s more current guidance, the picture does not fundamentally
change. For example, documentation for
&lt;a href="https://learn.microsoft.com/en-us/entra/msal/dotnet/how-to/token-cache-serialization?tabs=desktop" rel="nofollow noreferrer" target="_blank"&gt;MSAL.NET&lt;/a&gt;,
specifically for desktop apps, recommends persisting token caches locally and,
on Windows, protecting them using DPAPI or similar mechanisms. In other words,
the responsibility for secure storage remains with the application and the
underlying operating system rather than the .NET framework itself.&lt;/p&gt;
&lt;p&gt;Integrating facilities such as DPAPI or the Windows Credential Manager with
application configuration often requires additional code or libraries, as there
is no standard built-in bridge between secure OS storage and the .NET
configuration system. The documentation for MSAL.NET, linked just above,
includes mention of the &lt;code&gt;Microsoft.Identity.Client.Extensions.Msal&lt;/code&gt; NuGet
package, which has persistence support for token caches. The best recommendation
for general purpose secret persistence however is &lt;a href="https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.protecteddata?view=windowsdesktop-10.0" rel="nofollow noreferrer" target="_blank"&gt;the ProtectedData
class&lt;/a&gt;. There
are third party NuGet packages in this space as well, but trustworthiness is a
concern for such an important feature.&lt;/p&gt;
&lt;h2 id="what-actually-helps"&gt;What actually helps&lt;/h2&gt;
&lt;p&gt;Once you accept that secrets inside a client application cannot be fully
protected, the question changes. It’s no longer &lt;em&gt;how do I hide this credential?&lt;/em&gt;
but &lt;em&gt;how do I limit the damage when it’s used by the wrong person?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;There are two strategies, and they work best together.&lt;/p&gt;
&lt;h3 id="make-credentials-less-worth-stealing"&gt;Make credentials less worth stealing&lt;/h3&gt;
&lt;p&gt;If a credential is compromised, how much damage can it do? The answer should be:
as little as possible.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Restrict permissions to the minimum required&lt;/li&gt;
&lt;li&gt;Scope credentials to specific operations&lt;/li&gt;
&lt;li&gt;Prefer short-lived tokens over long-lived root secrets&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is where modern identity systems earn their keep, whether
cloud-based or self-hosted. OpenID Connect providers, managed identities, token
services, they don’t hide secrets better. They issue weaker, narrower ones, secrets of
much lower value to a potential hacker.&lt;/p&gt;
&lt;h3 id="reduce-the-blast-radius"&gt;Reduce the blast radius&lt;/h3&gt;
&lt;p&gt;If a credential or an application is compromised, how far can the damage spread?
There are two ways to constrain it: change the architecture, or change the
environment.&lt;/p&gt;
&lt;p&gt;Changing the architecture is the most powerful option: instead of giving a
client direct access to a database, you introduce a service layer. The client
talks to an API, the API talks to the database.&lt;/p&gt;
&lt;p&gt;Now the high-value credentials live in a controlled environment: on a server you
manage, not on every user’s machine. The API of that server, the services it
publishes, define what is possible. A connection string allows arbitrary SQL. An
API should not.&lt;/p&gt;
&lt;p&gt;A service layer also solves another problem: it decouples client authentication
from backend authentication. If your database or backend service only supports
long-lived credentials, the API can still offer token-based, short-lived access
to clients. The powerful credential stays on the server, the client never sees
it.&lt;/p&gt;
&lt;p&gt;The narrower and more specific your API is, the less damage can be done. Of
course the client will still need credentials to access the API, but with a
careful structure potential damage is very limited even if a client is fully
compromised.&lt;/p&gt;
&lt;p&gt;This idea can also be extended to the client environment itself. In managed
Windows environments, administrators can reduce the blast radius further by
restricting what users are allowed to do on the machine: limiting which
applications can be executed (e.g. via AppLocker or Windows Defender Application
Control), enforcing restricted user accounts, or even locking systems into
kiosk-style operation. These measures do not eliminate the underlying issue, but
they can make it significantly harder to exploit in practice by removing the
ability to run arbitrary code alongside the application.&lt;/p&gt;
&lt;p&gt;A service layer also opens up an entire category of server-side protections that
are simply impossible to enforce on a client machine: rate limiting, anomaly
detection, device or IP binding, audit logging. These don’t prevent credential
misuse on their own, but they make abuse observable and containable - and they
only become options once privileged access has moved off the client.&lt;/p&gt;
&lt;h2 id="the-path-most-people-take"&gt;The path most people take&lt;/h2&gt;
&lt;p&gt;In practice, developers rarely jump straight to architectural changes. They tend
to go through a series of steps.&lt;/p&gt;
&lt;p&gt;First, they look for ways to avoid handling credentials at all, using Windows
Authentication or similar mechanisms. If that works, it’s ideal.&lt;/p&gt;
&lt;p&gt;If this is not an option, the second-best approach is to avoid embedding
powerful credentials directly, introducing identity providers or token-based
access instead.&lt;/p&gt;
&lt;p&gt;As long as any credentials need to be stored on the client machine, secure
storage becomes a concern - options have been discussed above.&lt;/p&gt;
&lt;p&gt;At this point, many developers feel they’ve “secured” their application. But if
you follow the logic from earlier, you arrive at an uncomfortable conclusion:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;None of these steps prevent a determined attacker with control over the
machine from using the application’s access.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And that’s where the final step becomes unavoidable.&lt;/p&gt;
&lt;h2 id="when-architecture-is-the-only-real-fix"&gt;When architecture is the only real fix&lt;/h2&gt;
&lt;p&gt;If the risk still matters - and in many systems it does! - the only meaningful
improvement comes from changing the shape of the system.&lt;/p&gt;
&lt;p&gt;Move privileged access away from the client. Introduce services. Narrow what
those services do.&lt;/p&gt;
&lt;p&gt;This doesn’t make your system invulnerable. But it changes the game from &lt;em&gt;anyone
with access can do anything&lt;/em&gt; to &lt;em&gt;even with access, only specific actions are
possible&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;That’s a huge difference.&lt;/p&gt;
&lt;p&gt;I strongly recommend reading our &lt;a href="https://community.devexpress.com/Tags/rbac" target="_blank"&gt;related blog series&lt;/a&gt;&amp;nbsp;(starting with &lt;a href="https://community.devexpress.com/blogs/news/archive/2024/02/09/modern-desktop-apps-and-their-complex-architectures.aspx" target="_blank" rel="nofollow noreferrer"&gt;Modern Desktop Apps And Their Complex Architectures&lt;/a&gt;) and&amp;nbsp;documentation pages about the &lt;a href="https://docs.devexpress.com/eXpressAppFramework/403394/backend-web-api-service" rel="nofollow noreferrer" target="_blank"&gt;Backend Web API Service&lt;/a&gt;, &lt;a href="https://docs.devexpress.com/WindowsForms/405145/data-access-security" rel="nofollow noreferrer" target="_blank"&gt;Data Access
Security&lt;/a&gt;,
and &lt;a href="https://docs.devexpress.com/eXpressAppFramework/404691/security-considerations/general-security-considerations#security-tiers" rel="nofollow noreferrer" target="_blank"&gt;XAF Security
Tiers&lt;/a&gt;. They go into more detail about how to design systems with these principles in
mind. Of course this approach is complex and specific to your application, its
architecture and requirements. Please don’t hesitate to reach out if we can
help!&lt;/p&gt;
&lt;h2 id="a-common-misconception-securestring"&gt;A common misconception: .NET &amp;quot;Secure&amp;quot; String&lt;/h2&gt;
&lt;p&gt;This comes up often enough to be worth addressing directly, in a few words.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/api/system.security.securestring" target="_blank"&gt;SecureString&lt;/a&gt; was designed to minimize the time secrets exist in memory in
plain text. In theory, that sounds helpful.&lt;/p&gt;
&lt;p&gt;In practice, especially in the managed .NET environment, it does little to solve
the problem. There are two reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Most APIs which connect you to services require “normal” strings, so the
secure in-memory representation &lt;code&gt;SecureString&lt;/code&gt; offers needs to be converted
into .NET strings. These conversions leave data in managed memory, just as if
you’d stored it there all along.&lt;/li&gt;
&lt;li&gt;Even if this could be prevented, the application still performs authenticated
operations. This leaves it open to control by a local user just like before.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So while it may reduce exposure in very narrow scenarios, it does nothing to
address the fundamental issue: the application already has the capability to
act. Finally, it&amp;#39;s difficult to ignore the&amp;nbsp;official Microsoft recommendations (&lt;a href="https://github.com/dotnet/platform-compat/blob/master/docs/DE0001.md" target="_blank"&gt;one&lt;/a&gt;,&amp;nbsp;&lt;a href="https://learn.microsoft.com/en-us/dotnet/fundamentals/runtime-libraries/system-security-securestring" target="_blank"&gt;two&lt;/a&gt;, &lt;a href="https://learn.microsoft.com/en-us/dotnet/fundamentals/runtime-libraries/system-security-securestring#how-secure-is-securestring" target="_blank"&gt;three&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/news/image_2.png" alt=""&gt;&lt;/p&gt;&lt;h2&gt;Your Feedback Matters!&lt;/h2&gt;
&lt;div data-survey-id="b31c0c9e-b420-4b2b-9501-2a16d14dd7af" data-survey-auth-required="false"&gt;&lt;/div&gt;</description>
      <pubDate>Thu, 02 Apr 2026 11:00:00 Z</pubDate>
      <dc:creator>Oliver Sturm (DevExpress)</dc:creator>
    </item>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:388283</guid>
      <link>https://community.devexpress.com/Blogs/news/archive/2026/04/01/microsoft-multilingual-app-toolkit-mat-has-been-deprecated-what-s-next-for-devexpress-powered-app-localization.aspx</link>
      <category domain="https://community.devexpress.com/Tags/.NET">.NET</category>
      <category domain="https://community.devexpress.com/Tags/.net+core">.net core</category>
      <category domain="https://community.devexpress.com/Tags/ASP.NET">ASP.NET</category>
      <category domain="https://community.devexpress.com/Tags/Blazor">Blazor</category>
      <category domain="https://community.devexpress.com/Tags/charting">charting</category>
      <category domain="https://community.devexpress.com/Tags/Dashboard">Dashboard</category>
      <category domain="https://community.devexpress.com/Tags/DevExtreme">DevExtreme</category>
      <category domain="https://community.devexpress.com/Tags/Featured">Featured</category>
      <category domain="https://community.devexpress.com/Tags/feedback">feedback</category>
      <category domain="https://community.devexpress.com/Tags/future">future</category>
      <category domain="https://community.devexpress.com/Tags/globalization">globalization</category>
      <category domain="https://community.devexpress.com/Tags/JS">JS</category>
      <category domain="https://community.devexpress.com/Tags/localization">localization</category>
      <category domain="https://community.devexpress.com/Tags/office">office</category>
      <category domain="https://community.devexpress.com/Tags/Reporting">Reporting</category>
      <category domain="https://community.devexpress.com/Tags/Roadmap">Roadmap</category>
      <category domain="https://community.devexpress.com/Tags/Survey">Survey</category>
      <category domain="https://community.devexpress.com/Tags/usability">usability</category>
      <category domain="https://community.devexpress.com/Tags/ux">ux</category>
      <category domain="https://community.devexpress.com/Tags/VCL">VCL</category>
      <category domain="https://community.devexpress.com/Tags/WinForms">WinForms</category>
      <category domain="https://community.devexpress.com/Tags/WPF">WPF</category>
      <category domain="https://community.devexpress.com/Tags/XAF">XAF</category>
      <title>Microsoft Multilingual App Toolkit (MAT) Has Been Deprecated: What’s Next for DevExpress-Powered App Localization?</title>
      <description>&lt;p&gt;&lt;span style="color:#000000;"&gt;As you probably know,&amp;nbsp;Microsoft Multilingual App Toolkit (MAT)&amp;nbsp;support ended&amp;nbsp;on October 15, 2025. Since MAT&amp;nbsp;is no longer supported, this post documents&amp;nbsp;localization-related alternatives available to the Microsoft developer community.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h2 style="color:#242424;"&gt;&lt;span&gt;What MAT Deprecation Means in Practice&lt;/span&gt;&lt;/h2&gt;&lt;ul style="color:#242424;"&gt;&lt;li&gt;No future compatibility guarantees with new tooling or runtimes.&lt;/li&gt;&lt;li&gt;Localization assets are not lost&amp;nbsp;— MAT uses standard XLIFF / RESX formats,&amp;nbsp;so translations remain reusable.&lt;/li&gt;&lt;li&gt;Microsoft recommends moving to alternative localization tools.&lt;/li&gt;&lt;/ul&gt;&lt;h2 style="color:#242424;"&gt;&lt;span&gt;What to Look for in a MAT Alternative&lt;/span&gt;&lt;br&gt;&lt;/h2&gt;&lt;p style="color:#242424;"&gt;&lt;span&gt;Key requirements for .NET apps:&lt;/span&gt;&lt;/p&gt;&lt;ul style="color:#242424;"&gt;&lt;li&gt;Centralized localization string management&lt;/li&gt;&lt;li&gt;Validation and consistency checks&lt;/li&gt;&lt;li&gt;Reuse of translations across versions&lt;/li&gt;&lt;li&gt;Support for RESX/XLIFF-based workflows&lt;/li&gt;&lt;/ul&gt;&lt;h2 style="color:#242424;"&gt;&lt;span&gt;New DevExpress Localization Tool at a Glance&lt;/span&gt;&lt;br&gt;&lt;/h2&gt;&lt;p style="color:#242424;"&gt;&lt;span&gt;All the aforementioned localization requirements are supported in the new &lt;a href="https://docs.devexpress.com/GeneralInformation/405620/localization/localization-tool" target="_blank" style="background-color:#ffff99;"&gt;DevExpress Localization Tool&lt;/a&gt; (available as Community Technology Preview or CTP&amp;nbsp;in v25.2): &lt;span style="background-color:#ffff99;"&gt;&lt;a href="https://github.com/DevExpress/Localization" target="_blank"&gt;Downloads&lt;/a&gt; | &lt;a href="https://docs.devexpress.com/GeneralInformation/404608/localization/localization-tool" target="_blank"&gt;Get Started&lt;/a&gt;&lt;/span&gt;.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style="color:#242424;"&gt;&lt;span style="color:#404040;"&gt;This new tool introduces enhanced collaboration capabilities, easier resource navigation/management, AI-powered translation services, support for multiple DevExpress products/platforms, and much more.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Key features include:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Simpler localization string management&lt;/strong&gt;&lt;br&gt;Use advanced data shaping capabilities available in our Data Grid control to locate resources, filter or group data, and more.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Enhanced translation consistency and coverage&lt;/strong&gt;&lt;br&gt;Locate duplicate strings, find inconsistent translations using a built-in localization validator, review context information, and run batch operations.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Multiple export types&lt;/strong&gt;&lt;br&gt;You can export translations as satellite assemblies, NuGet packages, a single merged RESX file for multiple products (replaces hundreds of assemblies), or JSON files for JS/TS-based products.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New collaboration capabilities&lt;/strong&gt;&lt;br&gt;You can now use change tracking, reviews, import/export capabilities, and built-in backups. All DevExpress product localization resources are available on GitHub. You can either use our Windows-based tool, modify your translations directly in RESX/XML, or build your own tool.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Support for multiple products/platforms&lt;/strong&gt;&lt;br&gt;The current version already supports numerous DevExpress UI libraries (WinForms, WPF, Blazor, ASP.NET Core, Reports, Dashboard, XAF). We plan to add support for .NET MAUI, DevExtreme, and VCL UI Controls in future release cycles.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;AI-powered resource translation&lt;/strong&gt;&lt;br&gt;Integrate your favorite AI service into our new Localization client.&lt;/li&gt;&lt;/ul&gt;&lt;p style="color:#242424;"&gt;&lt;span&gt;&lt;img src="https://www.devexpress.com/subscriptions/i/25.2/25-2-localization-tool@2x.png" alt=""&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="color:#242424;"&gt;&lt;span&gt;&lt;strong&gt;My favorite feature&lt;/strong&gt;&lt;span&gt;: a way to export all your multi-product translations to a &lt;a href="https://docs.devexpress.com/GeneralInformation/405620/localization/localization-tool#export-to-mergedsingle-resx" target="_blank" style="background-color:#ffff99;"&gt;single or merged RESX file&lt;/a&gt;. This is a huge time-saver or much simpler alternative to dozens of NuGet packages or satellite resources/assemblies (this&amp;nbsp;standard .NET approach is still supported). A single RESX file under your control means fewer dependencies in projects: no accidentally forgotten references and no heavy maintenance later when you add a new component to the project.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="color:#242424;"&gt;&lt;span&gt;&lt;img src="https://community.devexpress.com/blogs/news/single_localization_resource.png" alt="" style="width:1514px;height:896px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="color:#242424;"&gt;&lt;span&gt;&lt;span&gt;The fact that the&amp;nbsp;source translations&amp;nbsp;reside&amp;nbsp;on GitHub and the internal translation database (RESX/XML)&amp;nbsp;is accessible for custom tools (yes, our customers did that too)&amp;nbsp;or AI-based translations are&amp;nbsp;nice additions as well. I also think that our powerful WinForms Data Grid speaks for itself.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="color:#242424;"&gt;&lt;span&gt;&lt;img src="https://community.devexpress.com/blogs/news/machine_readable_sources_collage.png" alt="" style="width:2146px;height:1089px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2 style="color:#242424;"&gt;&lt;span&gt;Future Plans&lt;/span&gt;&lt;/h2&gt;&lt;p style="color:#242424;"&gt;&lt;span&gt;Long-term goal: one unified localization platform (even for VCL and JS) instead of multiple overlapping tools.&amp;nbsp;&lt;/span&gt;In 2026, we will improve ease of use/usability as follows:&lt;/p&gt;&lt;ul style="color:#242424;"&gt;&lt;li&gt;Automatic localization resource downloads vs manual copy/paste from GitHub;&lt;/li&gt;&lt;li&gt;Automatic product selection for localization (based on application DLL)&lt;/li&gt;&lt;li&gt;Better integration with DevExtreme JS / TS (&lt;a href="https://docs.devexpress.com/AspNetCore/400577/devextreme-based-controls/concepts/localization" target="_blank"&gt;Intl and custom dictionaries&lt;/a&gt;), XAF (&lt;a href="https://docs.devexpress.com/eXpressAppFramework/113297/localization/localization-tool" target="_blank"&gt;XAFML files&lt;/a&gt;), VCL (&lt;a href="https://docs.devexpress.com/VCL/154039/ExpressCrossPlatformLibrary/how-to/localize-an-application" target="_blank"&gt;INI files&lt;/a&gt;).​&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="color:#000000;"&gt;Ultimately, the new&amp;nbsp;&lt;a href="https://docs.devexpress.com/GeneralInformation/405620/localization/localization-tool" target="_blank"&gt;DevExpress Localization Tool&lt;/a&gt;&amp;nbsp;offers a modern path forward for DevExpress-powered apps. Older DevExpress localization utilities are now in maintenance mode (see also&amp;nbsp;&lt;a href="https://docs.devexpress.com/GeneralInformation/404608/localization/localization#tools" target="_blank" style="background-color:#ffff99;"&gt;this comparison&lt;/a&gt;). For example, we will continue to maintain the&amp;nbsp;&lt;a href="https://localization.devexpress.com/" target="_blank"&gt;localization.devexpress.com&lt;/a&gt;&amp;nbsp;service as we have no alternatives for older DevExpress product versions, but this service will only receive&amp;nbsp;bug fixes. While you can use&amp;nbsp;the service for new DevExpress versions, we recommend that you give the new tool a&amp;nbsp;try for translation-related tasks (on Windows at least).&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;Your Feedback Matters!&lt;/h2&gt;
&lt;div data-survey-id="16f43533-a02a-43b0-9a22-bbab1c5aa730" data-survey-auth-required="false"&gt;&lt;/div&gt;
&lt;p&gt;&lt;span&gt;Thanks,&lt;/span&gt;&lt;br&gt;&lt;span&gt;Dennis Garavsky&lt;/span&gt;&lt;br&gt;&lt;span&gt;Principal Product Manager&lt;/span&gt;&lt;br&gt;&lt;a href="mailto:dennis@devexpress.com" title="Email me if you have questions or suggestions"&gt;dennis@devexpress.com&lt;/a&gt;&lt;br&gt;&lt;/p&gt;</description>
      <pubDate>Wed, 01 Apr 2026 05:15:00 Z</pubDate>
      <dc:creator>Dennis Garavsky (DevExpress)</dc:creator>
    </item>
  </channel>
</rss>