为并行程序集创作 DLL

创建自己的并行程序集时,请遵循 “创建并行程序集指南 ”,并根据以下准则创作程序集中使用的任何 DLL:

  • 应设计 DLL,以便多个版本可以同时和在同一进程中运行,而不会相互干扰。 例如,许多应用程序托管多个插件,每个插件都需要一个组件的不同版本。 并行程序集的开发人员需要设计和测试,以确保组件多个版本在同一进程中同时运行时正常工作。

  • 如果计划在早于 Windows XP 的系统上提供组件作为共享组件,则需要继续将这些系统上的组件安装为单实例共享组件。 在这种情况下,需要确保组件向后兼容。

  • 在系统上运行多个版本的程序集时,评估对象的使用。 确定程序集的不同版本是否需要单独的数据结构,例如内存映射文件、命名管道、已注册Windows消息和类、共享内存、信号灯、互斥体和硬件驱动程序。 跨程序集版本使用的任何数据结构都必须向后兼容。 确定可在版本之间使用哪些数据结构,以及哪些数据结构必须专用于某个版本。 确定共享数据结构是否需要单独的同步对象,例如信号灯和互斥体。

  • 某些对象(如窗口类和 Atoms)为每个进程唯一命名。 应为每个程序集使用清单对窗口类等对象进行版本控制。 对于 Atoms 等对象,请使用特定于版本的标识符,除非你计划跨版本共享。 如果使用特定于版本的标识符,请使用四部分版本号。

  • 在任何 DLL 中不包含自注册代码。 并行程序集中的 DLL 不能自注册。

  • 使用 #define 语句定义 DLL 中的所有特定于版本的名称。 这允许从一个位置更改所有注册表项。 发布新版本的程序集时,只需更改此#define语句。 例如:

    #define MyRegistryKey "MyAssembly1.0.0.0"

  • Microsoft Store Temp 目录中的任何非持久性数据。

  • 不要将用户数据放入全局位置。 将应用程序数据与用户数据分开。

  • 将所有共享文件分配一个依赖于应用程序名称的文件版本。

  • 分配跨进程使用的所有消息和数据结构,以防止意外的跨进程共享。

  • DLL 不应依赖于在可能不存在的版本之间共享,例如不跨不同版本的程序集共享的共享内存部分。

  • 如果添加新的功能不遵循原始 DLL 的二进制接口兼容性协定,则必须分配新的 CLSID、ProgId 和文件名。 然后,需要使用此 CLSID、ProgId 和文件名的并行程序集的未来版本。 当不并行的 DLL 版本通过并行版本注册时,这可以防止发生冲突。

  • 如果重复使用相同的 CLSID 或 ProgId,请测试以确保程序集向后兼容。

  • 在程序集代码中初始化和设置程序集的默认设置。 不要在注册表中保存默认设置。

  • 将版本分配给所有数据结构。

  • DLL 应存储并行程序集的状态,如并行程序集的创作状态存储中所述。