本文介绍在为 Microsoft Dataverse 构建和打包插件代码时需要了解的约束和限制条件,包括程序集约束、依赖程序集要求和 NuGet 打包选项。
插件集成约束
生成插件项目时,请记住以下输出程序集约束。
使用 .NET Framework 4.6.2
插件和自定义工作流活动程序集项目必须面向 .NET Framework 4.6.2。
注释
.NET Framework 4.6.2 的官方Microsoft 支持 将于 2027 年 1 月 12 日结束。 Microsoft计划在 2026 年第四季度期间引入对 .NET Framework 4.8 运行时的 Dataverse 插件支持。
将程序集限制为 16 MB
程序集可以包含多个插件类或类型,甚至包括自定义工作流活动,但不能大于 16 MB。 最佳做法是,只要大小保持在 16 MB 以下,即可将插件和工作流程序集合并到单个程序集中。
在注册程序集之前对程序集进行签名
如果不使用 依赖程序集 功能,则必须在将程序集注册到 Dataverse 之前对其进行签名。 若要对程序集进行签名,请使用项目属性或 Sn.exe(强名称工具)命令中的“Visual Studio 签名”选项卡。
NuGet CoreAssemblies 位于沙盒中
如果您将 Microsoft.CrmSdk.CoreAssembliesNuGet 包添加到项目中,则会添加所需的 Dataverse 程序集引用。 但是,这些程序集本身不会随您的插件程序集一起上传。 它们已存在于执行代码的服务器沙盒运行时中。
从属程序集
重要
依赖程序集功能对于插件开发非常重要,因此应该从头开始考虑使用它,即使你不需要。 在开发周期的后面,向插件项目添加对依赖程序集的支持要困难得多。
Microsoft不支持 ILMerge。 依赖程序集功能提供与 ILMerge 等相同的功能。
使用依赖程序集功能,将其他必需的 .NET 程序集或资源(如本地化字符串)与插件程序集一同包含在一个单独的 NuGet 包中,并在注册期间上传到 Dataverse 服务器。
NuGet 包文件存储在 PluginPackage 表中。 包的内容存储在文件存储中,而不是存储在 SQL 数据库中。
上传 NuGet 包时,包含实现 IPlugin 接口的类的任何程序集都在 PluginAssembly 表中注册并与插件包相关联。 在开发和维护项目时,可以继续更新 PluginPackage 表行,并在服务器上管理对相关插件程序集所做的更改。
在运行时,Dataverse 将从 PluginPackage 行中复制 NuGet 包的内容,并将其提取到沙盒运行时。 这样,插件所需的任何依赖程序集都可用。
重要
创建后,在服务器上的插件包的名称和版本不能更改。 尝试使用 API 调用执行此操作会导致错误。
无需签名程序集
无需对插件包中使用的插件程序集进行签名。
在没有依赖程序集功能的情况下注册单个插件程序集时,需要签名,因为它为程序集提供唯一的名称。 但是,对于插件包中的插件程序集,程序集会使用不同的机制在沙盒服务器上加载,因此不需要签名。
重要
如果对程序集进行签名,请注意,已签名的程序集不能使用未签名程序集中包含的资源。 如果对插件程序集或任何依赖程序集进行签名,则必须对这些程序集依赖的所有程序集进行签名。
如果任何已签名程序集依赖于未签名的程序集,则会出现如下错误:“无法加载文件或程序集 AssemblyName、Version=Version、Culture=neutral、PublicKeyToken=null 或其依赖项之一。 需要强名称程序集。
依赖程序集的限制
使用插件依赖程序集时,以下限制适用:
- 不支持工作流扩展(也称为自定义工作流活动)。
- 不支持本地化环境。
- 不支持非托管代码。 不能包含对非托管资源的引用。
导入或注册插件包时的性能注意事项
插件包中包含大量(数百到数千)类的程序集,这些类实现 IPlugin,因此将其导入 Dataverse 需要相对较长的时间。
已观察到导入一千种插件类型的时间为 15 分钟。 无论是使用 API 调用还是通过 Web UI 导入解决方案,还是使用插件注册工具注册包,此持续时间都适用。
创建插件包
可以将插件程序集和任何依赖程序集放在 NuGet 包中,然后将包注册并上传到 Dataverse 服务器。 如果插件项目在运行时不需要任何依赖程序集,而不是 NuGet 包中 Microsoft.CrmSdk.CoreAssemblies 附带的程序集,则无需创建包。
了解如何 使用 PAC CLI 创建和注册插件包 ,以及如何 使用 Visual Studio 创建和注册插件包。
所有项目都必须使用 SDK 样式
插件包只能包含从特定格式(称为 SDK 样式)的项目文件生成的自定义程序集。 如果不遵循此规则,尝试使用插件注册工具注册包时,会收到错误(“找不到文件”)。
重要
将生成的编译程序集添加到插件包的所有 MSBuild 项目都必须使用“SDK 样式”格式。
SDK 样式项目是指项目的 .csproj 文件中包含以下代码行:<Project Sdk="Microsoft.NET.Sdk">。
使用其中一个工具(如 Power Platform CLI pac plugin init 命令)创建插件项目时,插件项目文件的格式正确。 下面是此类项目文件的示例。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net462</TargetFramework>
<PowerAppsTargetsPath>$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\PowerApps</PowerAppsTargetsPath>
<AssemblyVersion>1.0.0.0</AssemblyVersion>
<FileVersion>1.0.0.0</FileVersion>
<ProjectTypeGuids>{4C25E9B5-9FA6-436c-8E19-B395D2A65FAF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
</PropertyGroup>
...
</Project>
如果要将另一个项目添加到 Visual Studio 解决方案(如类库项目),请执行以下步骤创建 SDK 样式项目:
- 在 Visual Studio 中,使用 .NET 或 .NET Standard 模板将新项目添加到解决方案。 不要以 .NET Framework 为目标。
- 通过在解决方案资源管理器中右键单击项目名称并选择 “编辑项目文件”,或在单独的编辑器中打开项目的 .csproj 文件来编辑项目文件。
- 应在项目文件中看到该行
<Project Sdk="Microsoft.NET.Sdk">。 将 TargetFramework 属性更改为<TargetFramework>net462</TargetFramework>并保存文件。 - 验证您的解决方案是否编译成功,然后完成。
有关详细信息,请参阅 .NET 项目 SDK。
不依赖于 System.Text.Json
由于 Microsoft.CrmSdk.CoreAssemblies NuGet 包对 System.Text.Json 存在依赖,因此您可以在设计时引用 System.Text.Json 类型。 但是, System.Text.Json.dll 沙盒运行时中的文件可能与你在项目中引用的版本不同。 如果需要使用 System.Text.Json,请使用依赖程序集功能,并显式将其包含在 NuGet 包中。