The wait is finally over. Support for Visual Studio 2022 has arrived! All of your favorite features, and some great new features all wrapped in 64-bit goodness!
You can now register XrmToolkit on multiple computers at the same time with a Microsoft account. Simply press the 'Login to Microsoft Account' button during the registration process and use the same email address for all registrations. The standard license allows you to register on 2 computers at the same time. Other licenses may become available that allow for more than 2 registrations.
You can now link your Power Apps Control Framework projects with XrmToolkit and get all of the integrated goodness right from within Visual Studio. For more information see the documentation here.
Editing the ControlManifest.Input.xml file has never been easier with the built-in full-feature editor. For more information see the documentation here.
You can now reference 3rd party dlls in your plugin assembly projects without needing ILMerge or some other magic. Dependent assemblies (now in preview) allow you to package your plugin assembly into a NuGet package and deploy to Dataverse. XrmToolkit makes this easy by allowing you to select "NuGet package" as the assembly merge type.
Registering and editing your custom API's and their input/output parameters can now be done in the same place as registering your plugins or workflows.
Custom API support has been added to the 'Create New Plugin' wizard.
// By changing the precision you can affect the output of the 'GeneratedCode' attribute when generating proxy classes. // The following demonstrates the output based on an XrmToolkit version of 8.1.1.2 // Precision = 4 [GeneratedCode("XrmToolkit", "8.1.1.2")] // Precision = 3 [GeneratedCode("XrmToolkit", "8.1.1.0")] // Precision = 2 [GeneratedCode("XrmToolkit", "8.1.0.0")] // Precision = 1 [GeneratedCode("XrmToolkit", "8.0.0.0")]
[DebuggerNonUserCode] [ExcludeFromCodeCoverage] [EntityLogicalNameAttribute("account")] public partial class Account : BaseProxyClass { ... }
/// <summary> /// <para>Logical Name: name</para> /// <para>Max Length: 160 characters</para> /// </summary> [AttributeLogicalName("name")] [StringLength(160)] public string AccountName { .... }
// Adds the 'No-lock' statement to the query. var accountsQuery = this.Service.Queryable<Account>() .WithNoLock() .ToList();
// Adds the 'LateMaterialize' statement to the query. var accountsQuery = this.Service.Queryable<Account>() .WithLateMaterialize() .ToList();
// Adds the SQL query hints to the SQL query. var accountsQuery = this.Service.Queryable<Account>() .WithQueryHints(QueryHints.HashJoin, QueryHints.MergeJoin) .ToList();
// Returns accounts where the length of the name is greater than or equal to 6 characters. var accountsQuery = this.Service.Queryable<Account>() .Where(x => x.Name.Length >= 6) .ToList();
// Returns accounts that have both `Value1' and 'Value4' specified as values. // Results may also have other values specified. var accountsQuery = this.Service.Queryable<Account>() .Where(x => x.MultiSelectOptionset.ContainsValues(EnumValues.Value1, EnumValues.Value4)) .ToList();
// Returns accounts that have `Value3' specified as one of the values. // Results may also have other values specified. var accountsQuery = this.Service.Queryable<Account>() .Where(x => x.MultiSelectOptionset.Contains(EnumValues.Value3)) .ToList();
// Returns accounts that only have both `Value1' and 'Value4' specified and NOT any other values. var accountsQuery = this.Service.Queryable<Account>() .Where(x => x.MultiSelectOptionset.Equals(EnumValues.Value1, EnumValues.Value4)) .ToList();
When creating a new plugin/workflow project, you have the ability to make the project compatible with the latest C# versions by adding the 'PolySharp' NuGet package and selecting a C# version to target:
The 'TableNames' and 'MessageNames' files are generated as 'public const string' values instead of 'static readonly string' values. This should not break any code but is something to be aware of.